Как включить клавиатуру на ощупь после ее отключения с помощью setTextIsSelectable
Я использую пользовательскую клавиатуру в приложении, поэтому мне нужно отключить системную клавиатуру. Я могу сделать это с
editText.setShowSoftInputOnFocus(false);
для Android API 21+. Но чтобы сделать то же самое вплоть до API 11, я делаю
editText.setTextIsSelectable(true);
Иногда я хочу показать системную клавиатуру снова после отключения ее с помощью setTextIsSelectable
, Но я не могу понять, как. Выполнение следующих действий показывает системную клавиатуру, но если пользователь скрывает клавиатуру, а затем снова нажимает EditText, клавиатура по-прежнему не отображается.
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, 0);
Я думаю, я мог бы сделать editText.setOnFocusChangeListener
а затем вручную показать или скрыть системную клавиатуру, но я бы предпочел отменить все setTextIsSelectable
сделал. Следующее также не работает:
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.setClickable(true);
editText.setLongClickable(true);
Как мне это сделать?
1 ответ
Короткий ответ
Выполнение следующих действий обратит эффект setTextIsSelectable(true)
и позволить клавиатуре снова показывать, когда EditText
получает фокус.
editText.setTextIsSelectable(false);
editText.setFocusable(true);
editText.setFocusableInTouchMode(true);
editText.setClickable(true);
editText.setLongClickable(true);
editText.setMovementMethod(ArrowKeyMovementMethod.getInstance());
editText.setText(editText.getText(), TextView.BufferType.SPANNABLE);
объяснение
То, что мешает отображению клавиатуры isTextSelectable()
являющийся true
, Вы можете увидеть это здесь (спасибо @adneal).
Исходный код для setTextIsSelectable
является
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();
}
Таким образом, код в разделе короткого ответа над первым устанавливает mTextIsSelectable
в false
с setTextIsSelectable(false)
и затем отменяет все другие побочные эффекты один за другим.