2017-07-21 81 views
0

如果我創建一個活動的簡單的應用程序包含單個的EditText,和我做setTextIsSelectable如何防止鍵盤出現?

EditText editText = (EditText) findViewById(R.id.editText); 
editText.setTextIsSelectable(true); 

那麼這可以防止鍵盤出現(在我的測試在Android 5.0和7.1)。這就是我想要的東西的要求,在這些問題:

source code

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 

我一部分問,因爲我好奇,但也因爲我需要禁用我的應用程序的系統鍵盤。我想了解正在發生的事情,以便我確信它確實在做我認爲正在做的事情。

更新

後續問題和答案:

+0

[Editor.startSelectionActionModeInternal](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/Editor.java#L2009) – adneal

+1

@adneal,所以它似乎是因爲'!mTextView.isTextSelectable()'。隨意添加這個答案。我有點奇怪,爲什麼確保文本不可選擇將是顯示鍵盤的一個決定性因素(但是這些信息對於回答我的問題並不是必需的)。 – Suragch

回答

1

,當你調用TextView.setTextIsSelectable(true),然後選擇文本的Editor.startSelectionActionModeInternal結果鍵盤不顯示,在顯示文本選擇ActionMode之前檢查TextView.isTextSelectable是否爲false

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可以預測到可選擇以未在屏幕上跳躍的鍵盤移動它的結果。這可能只是一個UI決定。根據Git自2012年以來一直如此,但該承諾並未提及有關該實現的任何具體內容。