Как setTextIsSelectable предотвращает появление клавиатуры?

Если я создаю простое приложение с одним Activity, которое содержит один EditText, и я делаю

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

тогда это предотвращает появление клавиатуры (в моих тестах на Android 5.0 и 7.1). Это то, что я хочу, в соответствии с просьбой в этих вопросах:

Исходный код

public void setTextIsSelectable(boolean selectable) {
    if (!selectable && mEditor == null) return; // false is default value with no edit data

    createEditorIfNeeded();
    if (mEditor.mTextIsSelectable == selectable) return;

    mEditor.mTextIsSelectable = selectable;
    setFocusableInTouchMode(selectable);
    setFocusable(selectable);
    setClickable(selectable);
    setLongClickable(selectable);

    // mInputType should already be EditorInfo.TYPE_NULL and mInput should be null

    setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);
    setText(mText, selectable ? BufferType.SPANNABLE : BufferType.NORMAL);

    // Called by setText above, but safer in case of future code changes
    mEditor.prepareCursorControllers();
}

Но я не вижу, что из-за этого отключает метод ввода.

При вызове следующих методов все возвращаются true установить ли я setTextIsSelectable или нет.

editText.isFocusable();             // true
editText.isFocusableInTouchMode();  // true
editText.isClickable();             // true
editText.isLongClickable();         // true

Я частично спрашиваю, потому что мне любопытно, но также и потому, что мне нужно отключить системную клавиатуру в моем приложении. Я хочу понять, что происходит, чтобы быть уверенным, что он действительно делает то, что, я думаю, он делает.

Обновить

Дополнительный вопрос и ответ:

1 ответ

Решение

Клавиатура не отображается при вызове TextView.setTextIsSelectable(true) а затем выберите текст в результате Editor.startSelectionActionModeInternal, который проверяет, если TextView.isTextSelectable является false перед показом выделения текста ActionMode,

    final boolean selectionStarted = mTextActionMode != null;
    if (selectionStarted && !mTextView.isTextSelectable() && mShowSoftInputOnFocus) {
        // Show the IME to be able to replace text, except when selecting non editable text.
        final InputMethodManager imm = InputMethodManager.peekInstance();
        if (imm != null) {
            imm.showSoftInput(mTextView, 0, null);
        }
    }

Я думаю, почему это так, потому что команда разработчиков решила, что им нужен текст Editor может предсказать возможность выбора, чтобы не прыгать по экрану в результате перемещения клавиатуры. Вероятно, это было просто решение пользовательского интерфейса. Согласно git, так было с 2012 года, но коммит не упоминает ничего конкретно об этой реализации.

Другие вопросы по тегам