EditText禁止軟體盤彈出,且不影響其它功能

風吹過wu發表於2018-08-02

前言

昨天一個開發群裡有個哥們,問了這樣一個問題。想要EditText不彈出軟鍵盤,但是又要支援貼上,複製剪下功能。最初我想的是直接使用TextView設定textIsSelectable為true。但是沒有貼上的功能。。。。

群友的建議如下:

  • 在EditText外圍包一層佈局,讓外層的佈局獲取焦點
  • 直接設定Activity無法彈出軟鍵盤
  • 自定義View

自己試驗了一下,發現都還是有缺陷,後面想想去找找彈出軟體盤的位置,直接禁止掉就好了吧。EditText 繼承於TextView。最終我在TextView的onTouchEvent中找到了。

EditText禁止軟體盤彈出,且不影響其它功能
看到這裡,各位看官就清楚了吧,我只要讓if中的條件(isTextEditable() && mEditor.mShowSoftInputOnFocus && imm != null)其中一個為false。我們也就大功告成了。首先在EditText中沒有設定isTextEditalbe的方法,pass掉。接著imm != null 也pass掉。只剩下mEditor.mShowSoftInputOnFocus。點選進去一看。預設的就是true。

EditText禁止軟體盤彈出,且不影響其它功能
只要我們將該值設定成false。不就大功告成了。廢話到此為止,上大餐。

public static void setEditTextNoSoftInput(EditText editText) {

    Class editClass = editText.getClass().getSuperclass();
    Class textClass = editClass.getSuperclass();
    try {
        Field editorField = textClass.getDeclaredField("mEditor");
        editorField.setAccessible(true);
        Object editorObject = editorField.get(editText);
        Class editorClass = editorObject.getClass();
        if (!"Editor".equals(editorClass.getSimpleName())) {
            editorClass = editorClass.getSuperclass(); // 防止類似於華為使用的自身的HwEditor
        }
        Field mShowInput = editorClass.getDeclaredField("mShowSoftInputOnFocus");
        mShowInput.setAccessible(true);
        mShowInput.set(editorObject, false);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
複製程式碼

親測了小米還有華為手機,可以正常使用,補充一下,華為使用的是自身的HwEditor繼承的Editor,所以多拿了一次父類的Class。其它機型自行測試一下。 PS:後面才發現,有其他人已經寫過類似的部落格,不過自己就當記錄也是可以的。有時從原始碼出發,往往會有意想不到的收穫

相關文章