Пользовательский виджет ввода пин-кода Android

Я пытаюсь создать собственный виджет пин-кода для Android в качестве альтернативы просто использоватьEditText с атрибутом ввода пароля типа. То, что я хотел бы отобразить, это ряд ячеек, и каждый из них должен быть заполнен, когда пользователь вводит свой пин-код.

Кто-то сделал что-то подобное, но оказалось, что это фиксированное числоEditText просмотров и там было многоugly код для смены фокуса при вводе или удалении символов. Это НЕ подход, который я хочу использовать; скорее я проектирую мой, чтобы иметьcustomizable length (легко) и вести себя какsingle focusable view (не просто).

Моя концепция до сих пор является своего рода гибридом междуLinearLayout (чтобы держать "коробки") иEditText (чтобы сохранить ввод пользователя).

Это код до сих пор ...

<code>public class PinCodeView extends LinearLayout {
    protected static final int MAX_PIN_LENGTH = 10;
    protected static final int MIN_PIN_LENGTH = 1;

    protected int pinLength;
    protected EditText mText;

    public PinCodeView(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PinCodeView);
        try {
            pinLength = a.getInt(R.styleable.PinCodeView_pinLength, 0);
        } finally {
            a.recycle();
        }

        pinLength = Math.min(pinLength, MAX_PIN_LENGTH);
        pinLength = Math.max(pinLength, MIN_PIN_LENGTH);

        setupViews();

        Log.d(TAG, "PinCodeView initialized with pinLength = " + pinLength);
    }

    private void setupViews() {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        for (int i = 0; i < pinLength; i++) {
            // inflate an ImageView and add it
            View child = inflater.inflate(R.layout.pin_box, null, false);
            addView(child);
        }
    }

    public CharSequence getText() {
        // TODO return pin code text instead
        return null;
    }

    public int length() {
        // TODO return length of typed pin instead
        return pinLength;
    }

    @Override
    public boolean onCheckIsTextEditor() {
        return true;
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        // TODO return an InputConnection
        return null;
    }
}
</code>

О тех переопределениях:onCheckIsTextEditor () должен вернуть истину иonCreateInputConnection (EditorInfo outAttrs) должен вернуть новыйInputConnection объект для взаимодействия с InputMethod (клавиатурой), но это все, что я знаю.

Кто-нибудь знает, нахожусь ли я на правильном пути? Кто-нибудь сделал работу сInputConnection раньше или сделали свои собственные редактируемые представления способными дать руководство?

(Изменить 1) Посмотрев на это еще немного, кажется, я должен подкласс BaseInputConnection и предоставитьTextView или жеEditText как его цель:

<code>    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        if (!onCheckIsTextEditor()) {
            return null;
        }
        return new BaseInputConnection(mText, true);
    }
</code>

Предполагая, что это сохраняет текст в том виде, в котором он напечатан, мне все еще нужен какой-то способ обновить представления, чтобы отразить изменение содержимого ...

(Изменить 2) Поэтому я добавил этот пользовательский вид на экран для тестирования. Он показывает количество блоков, и весь вид можно сфокусировать, но клавиатура никогда не всплывает. Я знаю, что он получает / теряет фокус, потому что поля показывают выделение соответствующим образом, и я установилOnFocusChangedListener написать в logcat.

Что заставляет настоящую клавиатуру появляться, когда редактируемый вид фокусируется?

Ответы на вопрос(4)

Ваш ответ на вопрос