2015-10-06 143 views
2

我想要捕獲EditText自定義軟鍵盤上的退格/刪除按鈕事件。Android - 在自定義EditText上捕獲退格(刪除)按鈕

我該怎麼辦?

我想這些解決方案,但他們不爲我工作:

Android custom EditText and back button override

EditText OnKeyDown

Get back key event on EditText

Android EditText delete(backspace) key event

感謝您的幫助!


編輯: 我發現與功能DispatchKeyEvent是isssue修復:

@Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN 
     && event.getKeyCode() == KeyEvent.KEYCODE_DEL) { 
    // ... 
    } 
    return super.dispatchKeyEvent(event); 
} 
+0

你說的 「不工作」 是什麼意思?你在哪裏測試?在模擬器或設備上? – airowe

+0

當我按下軟鍵盤上的任何按鈕時,功能中的代碼不會執行(在所有情況之外)。我用我的設備(三星Galaxy S5)進行測試。 –

+0

檢查[KeyEvent類](http://developer.android.com/reference/android/view/KeyEvent.html)的文檔時,它指出捕獲軟輸入是不可靠的。你可能有更好的運氣在你的Activity類中重寫'onBackPressed()'並且在那裏做你需要做的事情。 **編輯:**除非你的意思是「將光標向後移動一個空格」而不是標準的後退導航鍵。 – PPartisan

回答

0

我發現對於isssue與功能DispatchKeyEvent修復:

@Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN 
     && event.getKeyCode() == KeyEvent.KEYCODE_DEL) { 
     // ... 
    } 
    return super.dispatchKeyEvent(event); 
} 
0

接住從軟輸入法主要活動在Android是不可靠的。下面是根據JavaDoc爲KeyEvent類的摘錄:

軟輸入法都可以使用輸入 多個文本和創造性的方式,也不能保證一個軟鍵盤上的任意按鍵將 生成密鑰事件:這由IME決定,並且在 事實上,發送這樣的事件是不鼓勵的。您絕對不應該依賴於 接收KeyEvents用於軟輸入方法上的任何鍵。特別是, 默認的軟件鍵盤將永遠不會發送任何關鍵事件到任何針對Jelly Bean或更高版本的 應用程序,並且只會發送事件 ,用於刪除和返回鍵的應用程序 針對冰淇淋三明治或更早版本。

一種解決方法可能涉及使用TextWatcher。每當在EditText中發生刪除時,字符數會下降。

myEditText.addTextChangedListener(this); 
//... 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if (count == 0) { 
     //text was deleted. 
    } 
} 

編輯:這是未經測試,所以可能不完全可靠。此外,值得指出的是,如果選擇並替換了長文本段,則count也可以讀取0。我創建了一個庫,旨在將撤消/重做功能添加到EditText,但也可以identify the difference between text being replaced and deleted,因此,如果您需要更高的準確性,這可能對您有用。

+0

非常感謝您的回答,但我重試了dispatchKeyEvent函數,它工作! –

+0

@nolimitee好:) - 這可能是值得回答你自己的問題,以防萬一它可以幫助其他人在未來這個問題 – PPartisan

+1

@nolimitee,請張貼解決方案作爲答案,這將有助於休息... – Irshu

0

請看看我在另一個類似主題中提供的解決方案:Android - cannot capture backspace/delete press in soft. keyboard。您需要構建自定義EditText類並覆蓋其中的onCreateInputConnection方法。它會讓你訪問deleteSurroundingText事件,當你點擊退格時,它將觸發。我已經在一些設備上測試過它,並希望它能在其他設備上工作。嘗試一下並給出反饋。

0

在這裏,你去..

editText.addTextChangedListener(new TextWatcher() { 

      private int before; 
      private int after; 
      private int prevLength; 
      private boolean isBackPressed; 
      ArrayList<Integer> arrayList; 

      @Override 
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
       prevLength = charSequence.length(); 
      } 

      @Override 
      public void onTextChanged(CharSequence charSequence, int start, int end, int count) { 

      } 

      @Override 
      public void afterTextChanged(Editable editable) { 
       isBackPressed = prevLength > editable.length(); 

       if(isBackPressed){ 
        Toast.makeText(getApplicationContext(),"Back",Toast.LENGTH_LONG).show(); 
       } 
      } 
     });