2011-05-11 127 views
2

我的問題是這樣的;EditText刪除密鑰不在第一次keydown註冊

我有一個編輯文本,並使用setKeyListener並創建一個新的NumberKeyListener。在這種情況下,當一個數字被擊中時,它按預期工作,但是當刪除/退格按鈕被擊中時,它不會在第一次X嘗試中註冊,但是在X + 1上它將會(其中X是數字)我打的鑰匙。例如,如果我輸入了5,那麼6,然後是7,我的編輯文本將讀取567,如果我點擊刪除,沒有任何反應,再次擊中它兩次,仍然沒有,在第四次擊中時,它將最終刪除7併成爲56。這很奇怪,因爲我在keydown回調中有一條日誌語句,而且它似乎甚至沒有在前3次按鍵上觸發它?

任何建議表示讚賞。

更新:我注意到,如果我點擊edittext並返回到它,我的刪除將註冊第一次點擊。是否有某種與編輯文本相關聯的按鍵緩衝區需要清除或什麼?

myedittext.setKeyListener(new NumberKeyListener() {   
     @Override 
     public int getInputType() { 
      return InputType.TYPE_CLASS_NUMBER; 
     } 

     @Override 
     public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) { 
      if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) { 
       //logic here 
      } else if (keyCode == KeyEvent.KEYCODE_DEL) { 
       Log.i("DEBUG","delete key hit"); 
       //more logic here 
      } 
      Log.i("DEBUG","key was pressed"); 
      update(); 
      return true; 
     } 

     @Override 
     protected char[] getAcceptedChars() { 
      return new char[]{'0','1','2','3','4','5','6','7','8','9'}; 
     } 
    }); 

通過上面我刪除從KeyListener的內所有的邏輯和update()調用的代碼,所有它,只是記錄版畫,我看到了相同的行爲,它似乎不承認第一次x按下刪除。

+0

歡迎來到Stack Overflow!你能否在你的文章中添加一些代碼? – 2011-05-11 17:07:09

+0

請發佈您的Key Listener和相關的後續代碼。 – 2011-05-11 17:46:14

+0

這隻適用於硬鍵,而不適用於軟鍵。採取從http://developer.android.com/reference/android/text/method/BaseKeyListener.html: 至於KeyListener的所有實現,這個類只涉及硬件鍵盤。軟件輸入法沒有義務觸發該類中的方法。 – 2013-01-31 19:35:54

回答

0

NumberKeyListener延伸BaseKeyListener

你嘗試重寫backspace()

http://developer.android.com/reference/android/text/method/BaseKeyListener.html#backspace%28android.view.View,%20android.text.Editable,%20int,%20android.view.KeyEvent%29

執行,當你按下一個TextView的KEYCODE_DEL鍵時發生的動作。如果有選擇,則刪除選擇;否則,刪除光標前的字符,如果有的話; ALT + DEL刪除光標所在行上的所有內容。 返回

true if anything was deleted; false otherwise. 

,請務必讓super.basckspace();有正確的行爲。


我沒有獲得一個SDK,現在對其進行測試,但這種添加到您的監聽器:

@Override 
boolean backspace(View view, Editable content, int keyCode, KeyEvent event) { 
    Log.d("NumberKeyListener","backspace() called"); 
    return super.backspace(); 
} 

從我所理解的措辭和BaseKeyListener.java代碼,它是一個回調,當按下刪除鍵時響應。

+0

糾正我,如果我錯了,但backspace()是有效地模擬KEYCODE_DEL keydown事件的手段?如何使用此功能可以糾正用戶按下刪除/退格時不註冊的問題? – Siloid 2011-05-11 19:45:13

+0

@Siloid檢查我的更新回覆。我相信這是對於監聽者的回調,不是爲了模擬按鍵(這裏有'KeyEvent.dispatch()')。正如我上面所說,我現在無法測試它,但它是一個足夠短的代碼給你一個嘗試。 – Aleadam 2011-05-11 20:28:25

1

請注意,不能保證接收關鍵事件,包括KEYCODE_DEL,除非您在視圖中重寫onCreateInputConnection(),然後返回TYPE_NULL作爲InputType的調用IME。一個例子可以在這裏找到:

Android - cannot capture backspace/delete press in soft. keyboard

然而,我會使用關鍵事件在所有如果要覆蓋的EditText,因爲EditText上已經直接提供輸入過濾設備支持你的目的:

myEditText.setFilters(new InputFilter[]{ 
    //Filter this so that it removes everything that is not a digit. 
    new InputFilter() { 
    @Override 
    public CharSequence filter(CharSequence source, int start, 
           int end, Spanned dest, int dstart, int dend) { 
     //This is filtering ONE character at a TIME, as the user types them. 
     String sourceString = source.toString(); 
     String sourceStringDigits = sourceString.replaceAll("[^]", ""); 
     return sourceStringDigits; 
    } 
    } 
}; 

上面應該過濾您的文本,而不會干擾退格鍵(刪除)處理,這是由EditText本身處理。