2017-07-21 1 views
1

J'utilise un custom in-app keyboard, je dois donc désactiver le clavier du système. Je peux le faire avecComment activer le clavier au toucher après l'avoir désactivé avec setTextIsSelectable

editText.setShowSoftInputOnFocus(false); 

pour Android API 21+. Mais pour faire la même chose jusqu'à API 11, je fais

editText.setTextIsSelectable(true); 

Parfois, je veux montrer le clavier du système à nouveau après la désactivation avec setTextIsSelectable. Mais je ne peux pas comprendre comment. Les actions suivantes montrent le clavier du système, mais si l'utilisateur masque le clavier et clique à nouveau sur EditText, le clavier ne s'affiche toujours pas.

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(editText, 0); 

Je suppose que je pouvais faire editText.setOnFocusChangeListener puis afficher manuellement ou masquer le clavier du système, mais je préférerais défaire tout ce qui a fait setTextIsSelectable. Ce qui suit ne fonctionne pas non plus:

editText.setFocusable(true); 
editText.setFocusableInTouchMode(true); 
editText.setClickable(true); 
editText.setLongClickable(true); 

Comment faire?

Related question

Répondre

1

Réponse courte

Faire ce qui suit va inverser les effets de setTextIsSelectable(true) et permettre au clavier pour afficher à nouveau lorsque le EditText reçoit le focus.

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); 

Explication

La seule chose qui empêche le clavier de montrer est isTextSelectable() être true. Vous pouvez voir que here (merci à @adneal).

Le code source pour setTextIsSelectable est

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(); 
} 

Ainsi, le code dans la section courte réponse ci-dessus les premiers ensembles mTextIsSelectable-false avec setTextIsSelectable(false) et dénoue alors tous les autres effets secondaires un par un.