2017-07-21 145 views
1

我使用的是custom in-app keyboard,所以我需要禁用系統鍵盤。我可以用如何使用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); 

我該怎麼辦?

Related question

回答

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的事情。您可以看到here(感謝@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(); 
} 

因此,在短答案部上面的代碼首先設置mTextIsSelectablefalsesetTextIsSelectable(false),然後撤消所有的其他副作用一個接一個。