問題
可能看到標題的同學一頭霧水,這是什麼東西,其實類似於你長按文本時出現的複製粘貼pop彈窗。在一些定製ROM中,廠商爲了某些方便用戶的特殊功能會增加文本輸入檢測和自定義彈窗,舉例:
比如在你輸入一些郵箱時,會自動彈出這種pop(並不需要你長按),且這個並非系統應用纔有的,而是直接影響了所有EditText。
對於一些高度定製化UI的應用來說,這個可能影響用戶體驗。下面給出兩種解決辦法(都不算特別完美,畢竟卑微的應用層開發者改不了底層實現),大家酌情參考。
解決
方法一:
要解決問題先思考(合理猜測)一下它的實現原理,很顯然它修改了EditText或者TextView源碼,在文本輸入監聽中加入了對郵箱特徵的檢測,我們可以嘗試修改getText方法的返回值,過濾這種特徵:
// 在自定義的EditText中重寫getText
@Override
public Editable getText() {
String text = super.getText() != null ? super.getText().toString() : null;
if (text != null && text.contains("@")) {
// 如果輸入內容包含@符號,則刪掉再返回
return Editable.Factory.getInstance().newEditable(text.replaceAll("@", ""));
}
return super.getText();
}
當然有同學會說,上述辦法也影響了getText方法返回內容的正確性,沒關係,我們反正是自定義控件,再補一個方法即可,業務代碼外部調用就調這個:
public Editable getRealText() {
return super.getText();
}
方法二:
這個方法適合不需要自定義EditText遊標的同學,非常簡單,給EditText的xml代碼加上 android:textCursorDrawable="@null"
屬性即可。
有人會覺得奇怪,這個cursor的drawable跟pop彈窗有啥關係,因爲原生的複製粘貼pop彈窗在顯示之前要計算遊標(Cursor)的位置,且會檢查 mDrawableForCursor
是否存在,如果不存在就不走後續邏輯了,具體可以參看Editor源碼:
void updateCursorPosition() {
loadCursorDrawable();
if (mDrawableForCursor == null) {
return;
}
// ...
}
那麼上述“常用郵箱”之類的彈窗其實也類似。