Ручка введите ключ в EditText на разных устройствах

Сейчас я обрабатываю ключ ввода в своих полях EditText, используя onEditorActionListener и просматривая идентификатор действия для IME_NULL. Он отлично работает для всех моих пользователей, кроме одного. У нее есть Xperia Arc.

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

Никаких кубиков тоже. Сейчас я в недоумении. Существует множество приложений, которые отлично обрабатывают ключ ввода. что они делают по-другому?

Ответ 1

Я понял, как заставить его работать.

Мне пришлось добавить android: singleLine = "true" в тег EditText в XML-макете (поочередно вы можете установить его с помощью setSingleLine() в коде). Это заставляет текст редактирования использовать только одну строку, и фокус переходит к следующему блоку EditText.

Ответ 2

Попробуйте это решение: (я его не тестировал)

Задайте следующее свойство для 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;
        }
    };

Ответ 3

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