Как включить клавиатуру на ощупь после ее отключения с помощью 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) и затем отменяет все другие побочные эффекты один за другим.

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