Обрабатывать клавишу ввода в EditText на разных устройствах - PullRequest
10 голосов
/ 19 июня 2011

Прямо сейчас я обрабатываю ключ ввода в моих полях 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;
  }
});

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

Ответы [ 3 ]

17 голосов
/ 21 июня 2011

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

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

7 голосов
/ 19 июня 2011

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

Установите следующее свойство для 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 голосов
/ 04 июня 2014
(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;
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...