Ручка введите ключ в 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;
}
});