2012-10-14 39 views
9

我在Android上工作回車鍵使用TextWatcher。以前我使用onKeyListener來處理關鍵事件的特定操作。如何處理在Android

然而,這種方式似乎並沒有解決我的問題,因爲幾乎所有的關鍵將得到禁止,一旦我已經實施了監聽我的EditText。在閱讀了SO中的一些主題之後,我知道應該使用TextWatcher代替,但是我仍然在想如何處理ENTER裏面的關鍵事件,因爲那裏提供的參數只有CharSequence,Editable等。我沒有找到任何keyCode參數。

+0

'但是,這種方式似乎並沒有解決我的問題,因爲幾乎所有的關鍵將得到禁止,一旦我已經實施了監聽我的EditText.'..seams喜歡你的代碼是不正確的。它應該工作。與'文本守望者'你不能'輸入事件' –

+1

爲什麼我的問題被拒絕投票? – mrkhv

回答

7

試試這個

protected View.OnKeyListener onEnter = new View.OnKeyListener() { 

    @Override 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if ((event.getAction() == KeyEvent.ACTION_DOWN) 
       && (keyCode == KeyEvent.KEYCODE_ENTER)) { 
      //here do what you want 
     } 
     return false; // very important 
    } 
}; 
+3

根據DOC:當硬件密鑰被分配到一個view._ – Divers

+2

潛水員說,其實KeyListener的監聽硬件鍵(音量,家居等)_Called。 – Waclock

14

試試這個

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if (s.length()>0 && s.subSequence(s.length()-1, s.length()).toString().equalsIgnoreCase("\n")) { 
     //enter pressed 
    } 
} 
+0

user2348959感謝答案超級解決方案 –

+0

@ user2348959該方法不適合的目的。如果你向後移動一條線,這也會被調用。 –

+0

@ user2348959如果新行出現在字符串的結尾它工作..但它不工作的新線串之間出現 – Pallavi

0

我覺得這是更好的解決方案,因爲你只能在最後在你的EditText字段的任何地方按「確認」鍵,而不是線。

edittext.addTextChangedListener(new TextWatcher() { 
     public void afterTextChanged(Editable s) { 
     } 

     public void beforeTextChanged(CharSequence s, int st, int ct, 
             int af) { 
     } 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (s.length() < 1 || start >= s.length() || start < 0) 
       return; 

      // If it was Enter 
      if (s.subSequence(start, start + 1).toString().equalsIgnoreCase("\n")) { 

       // Change text to show without '\n' 
       String s_text = start > 0 ? s.subSequence(0, start).toString() : ""; 
       s_text += start < s.length() ? s.subSequence(start + 1, s.length()).toString() : ""; 
       edittext.setText(s_text); 

       // Move cursor to the end of the line 
       edittext.setSelection(s_text.length()); 
      } 
     } 
    });