2011-06-19 51 views
10

現在,我使用onEditorActionListener處理EditText字段中的Enter鍵,並查看IME_NULL的Action ID。除了一個用戶以外,它對我的​​所有用戶都很好她有一個Xperia弧。在不同設備上的EditText中處理Enter鍵

TextView.OnEditorActionListener keyListener = new TextView.OnEditorActionListener(){ 
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { 
    if(actionId == EditorInfo.IME_NULL){ 
     if(((EditText)findViewById(view.getId())) == ((EditText)findViewById(R.id.etUser))){ 
     ((EditText) findViewById(R.id.etPass)).requestFocus(); 
     } 
     if(((EditText)findViewById(view.getId())) == ((EditText)findViewById(R.id.etPass))){ 
     logon(); 
     } 
    } 
    return true; 
    } 
}; 

瞭解了這個問題之後,我嘗試另一種方法通過使用onKeyListener和尋找關鍵事件ACTION_DOWN然後檢查鍵碼,如果它匹配KEYCODE_ENTER。

EditText etUserName = (EditText) findViewById(R.id.etUser); 
etUserName.setOnKeyListener(new OnKeyListener() { 
    public boolean onKey(View view, int keyCode, KeyEvent event){ 
    if (event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch (keyCode) 
     { 
     case KeyEvent.KEYCODE_DPAD_CENTER: 
     case KeyEvent.KEYCODE_ENTER: 
      if(((EditText)findViewById(view.getId())) == ((EditText)findViewById(R.id.etUser))){ 
      ((EditText) findViewById(R.id.etPass)).requestFocus(); 
      } 
      return true; 
     default: 
      break; 
     } 
    } 
    return false; 
    } 
}); 

也沒有骰子。我現在虧本了。有很多應用程序可以處理輸入密鑰。他們有什麼不同?

+0

你有沒有找到解決這個bug的方法?我實際上需要攔截輸入法,不僅將文本保留在一行上。 – pgsandstrom

回答

16

我想出如何得到它的工作。

我不得不將android:singleLine =「true」添加到佈局XML中的EditText標籤(或者您可以在代碼中使用setSingleLine()來設置它)。這會強制編輯文本只使用一行,焦點將轉到下一個EditText框。

+0

TY我必須在G2X上執行此操作才能顯示下一個按鈕。 – maebe

+0

感謝您的解決方案。我試圖趕上輸入密鑰。另外,當虛擬鍵盤上的輸入鍵被擊中時,試圖跳到下一個EditText。直到我看到你提供的這條簡單的線條,一切都解決了。 +1! – detno29

+0

使用'android:maxLines =「1」'代替,因爲'android:singleLine =「true」'已棄用 – blueware

6

嘗試這種解決方案:(我沒有測試過)

設置以下屬性爲您EditText

android:imeOptions="actionNext" 

現在,您可以設置以下onEditorAction

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    if (actionId == EditorInfo.IME_ACTION_NEXT) { 
     // Program Logic Here 
     return true;  
    } 
    return false; 
} 

對於一些附加功能,您可以將您的密碼EditText設置爲:

android:imeOptions="actionDone" 

所以,你可以然後只是有這樣的事情:

TextView.OnEditorActionListener keyListener = new TextView.OnEditorActionListener(){ 
     public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { 
      if(actionId == EditorInfo.IME_ACTION_NEXT) { 
       ((EditText) findViewById(R.id.etPass)).requestFocus(); 
      } 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 
       logon(); 
      } 
      return true; 
     } 
    }; 
+0

在我的設備上正常工作,用戶沒有任何問題。我給了她一個測試版本,其中包含一些調試代碼,用於在文本視圖中顯示操作ID。沒有。我不認爲它甚至會進入onEditorAction方法。 – Scott

+0

所以沒有行動id,不管她按什麼?即使它是一個角色? – jsw

+0

在onEditorAction中,如果不使用該操作,請記得返回false。 –

0
(EditText) passwordView = (EditText) findViewById(R.id.password); 
passwordView.setImeOptions(EditorInfo.IME_ACTION_DONE); 
    passwordView.setOnEditorActionListener(new OnEditorActionListener() 
     { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
      { 
       String input; 
       if(actionId == EditorInfo.IME_ACTION_DONE) 
       { 
        input= v.getText().toString(); 
        Toast toast= Toast.makeText(LogIn.this,input, 
          Toast.LENGTH_LONG); 
        toast.setGravity(Gravity.CENTER, 0, 0); 
        toast.show(); 
        return true; 
       } 
       return false; 
      } 
     }); 
+1

請不要僅僅提供代碼,而且還要提供一些直覺。 – vefthym

+0

你能解釋一下你的答案嗎? – grattmandu03

+1

當passwordView被集中時,鍵盤上的鍵「next」變成「OK」,如果你點擊OK,onEditorAction()會調用 –