2011-06-19 9 views
10

W tej chwili używam klawisza Enter w polach EditText za pomocą obiektu onEditorActionListener i patrząc na identyfikator Action ID dla IME_NULL. Działa dobrze dla wszystkich moich użytkowników oprócz jednego. Ma łuk Xperii.Obsługa klawisza Enter w EditText na różnych urządzeniach

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; 
    } 
}; 

Po nauczeniu się o problemie, próbowałem innego podejścia przy użyciu onKeyListener i szuka klucza ACTION_DOWN zdarzeń następnie sprawdzanie kodu dostępu, jeśli dopasowane 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; 
    } 
}); 

Brak również kostek. Brakuje mi teraz. Istnieje wiele aplikacji, które obsługują klawisz Enter. co oni robią inaczej?

+0

Czy przypadkiem znalazłeś obejście tego błędu? Właściwie muszę przechwycić Enter-Press, nie tylko zachować tekst w jednym wierszu. – pgsandstrom

Odpowiedz

16

I zorientowali się, jak zmusić go do pracy.

Musiałem dodać android: singleLine = "true" do tagu EditText w układzie XML (alternatywnie można ustawić go za pomocą setSingleLine() w kodzie). Zmusza to tekst edycyjny do użycia tylko jednej linii, a fokus przejdzie do następnego pola EditText.

+0

TY Musiałem to zrobić na G2X, aby uzyskać następny przycisk do pokazania. – maebe

+0

Dzięki za to rozwiązanie. Próbowałem złapać klawisz Enter. Próbowano również przejść do następnego EditText po naciśnięciu klawisza Enter na klawiaturze wirtualnej. Dopóki nie zobaczyłem tej prostej linii, którą podałeś, wszystko jest rozwiązane. +1 za to! – detno29

+0

użyj 'android: maxLines =" 1 "' zamiast tego ponieważ 'android: singleLine =" true "' jest przestarzałe – blueware

6

Spróbuj tego rozwiązania: (ja jej nie testowane)

Ustaw następującą właściwość do swojej EditText

android:imeOptions="actionNext" 

Teraz można ustawić następujące onEditorAction

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

Dla niektórych dodatkowe funkcje, możesz ustawić hasło EditText na:

android:imeOptions="actionDone" 

Więc może to po prostu mieć coś takiego:

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

Działa dobrze na moim urządzeniu, nic na użytkowników. Dałem jej kompilację testową z kodem debugowania, który wyświetla identyfikator akcji w tekście. nic. Nie sądzę, że jest to nawet metoda onEditorAction. – Scott

+0

Więc nie ma identyfikatora działania, bez względu na to, co ona naciśnie? Nawet jeśli jest to postać? – jsw

+0

W przypadku funkcji onEditorAction należy pamiętać, aby zwracać wartość false, jeśli nie wykonano tej czynności. –

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

Proszę nie tylko podać kod, ale także intuicję. – vefthym

+0

Czy mógłbyś wyjaśnić swoją odpowiedź trochę bardziej proszę. – grattmandu03

+1

kiedy passwordView jest skupiony klawisz "next" to "ok", a jeśli klikniesz OK, funkcja onEditorAction() wywoła –

Powiązane problemy