前言
昨天一個開發群裡有個哥們,問了這樣一個問題。想要EditText不彈出軟鍵盤,但是又要支援貼上,複製剪下功能。最初我想的是直接使用TextView設定textIsSelectable為true。但是沒有貼上的功能。。。。
群友的建議如下:
- 在EditText外圍包一層佈局,讓外層的佈局獲取焦點
- 直接設定Activity無法彈出軟鍵盤
- 自定義View
自己試驗了一下,發現都還是有缺陷,後面想想去找找彈出軟體盤的位置,直接禁止掉就好了吧。EditText 繼承於TextView。最終我在TextView的onTouchEvent中找到了。
看到這裡,各位看官就清楚了吧,我只要讓if中的條件(isTextEditable() && mEditor.mShowSoftInputOnFocus && imm != null)其中一個為false。我們也就大功告成了。首先在EditText中沒有設定isTextEditalbe的方法,pass掉。接著imm != null 也pass掉。只剩下mEditor.mShowSoftInputOnFocus。點選進去一看。預設的就是true。 只要我們將該值設定成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:後面才發現,有其他人已經寫過類似的部落格,不過自己就當記錄也是可以的。有時從原始碼出發,往往會有意想不到的收穫