Как setTextIsSelectable предотвращает появление клавиатуры?
Если я создаю простое приложение с одним Activity, которое содержит один EditText, и я делаю
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);
тогда это предотвращает появление клавиатуры (в моих тестах на Android 5.0 и 7.1). Это то, что я хочу, в соответствии с просьбой в этих вопросах:
- Отключить программную клавиатуру из EditText, но разрешить копирование / вставку?
- Как отключить Android Soft Keyboard для определенной активности?
- Android: отключить программную клавиатуру на всех EditTexts
- Как отключить всплывающее окно клавиатуры при редактировании текста?
- Отключить клавиатуру на EditText
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 года, но коммит не упоминает ничего конкретно об этой реализации.