У меня есть несколько текстовых полей для редактирования в одной строке. После того, как пользователь вводит определенное количество символов в первом, я хочу автоматически перейти к следующему тексту редактирования. Как достичь этого?
Как автоматически перейти к следующему редактированию текста в android
Ответ 1
Вы можете достичь этого, используя класс Text Watcher
, а затем установите фокус на следующий EditText
в методе OnTextChanged()
TextWatcher.
В вашем случае, поскольку у вас есть два текста редактирования, скажем et1
и et2
. Вы можете попробовать следующий код: -
et1.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start,int before, int count)
{
// TODO Auto-generated method stub
if(et1.getText().toString().length()==size) //size as per your requirement
{
et2.requestFocus();
}
}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
Я сам не проверил код, но надеюсь, что это поможет вам решить вашу проблему.
Ответ 2
Существует более простой способ сделать это, что не связано с знанием идентификаторов представлений EditText. Для использования с android: maxLength = "1".
// onTextChanged
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
TextView text = (TextView)getCurrentFocus();
if (text != null && text.length() > 0)
{
View next = text.focusSearch(View.FOCUS_RIGHT); // or FOCUS_FORWARD
if (next != null)
next.requestFocus();
doSearch(); // Or whatever
}
}
// afterTextChanged
@Override
public void afterTextChanged(Editable s) {}
// beforeTextChanged
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {}
Ответ 3
Принятый ответ хорош.
Я предоставляю новый способ, если вы используете библиотеку RxJava + RxBinding.
Кодирование указывает 4 ввода. Редактировать текст необходимо проверить (мой случай - это SMS-сообщение с активным кодом через телефон - подтверждение по телефону)
// Show button Active code when enough fields active code
Observable<Boolean> mObsPhoneVerify1 = RxTextView.textChanges(db.etPhoneVerify1)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
db.etPhoneVerify2.requestFocus();
return charSequence != null && !charSequence.toString().equals("");
}
);
Observable<Boolean> mObsPhoneVerify2 = RxTextView.textChanges(db.etPhoneVerify2)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
db.etPhoneVerify3.requestFocus();
return charSequence != null && !charSequence.toString().equals("");
});
Observable<Boolean> mObsPhoneVerify3 = RxTextView.textChanges(db.etPhoneVerify3)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
db.etPhoneVerify4.requestFocus();
return charSequence != null && !charSequence.toString().equals("");
});
Observable<Boolean> mObsPhoneVerify4 = RxTextView.textChanges(db.etPhoneVerify4)
.observeOn(AndroidSchedulers.mainThread())
.map(charSequence -> {
db.etPhoneVerify1.requestFocus();
hideKeyboard();
return charSequence != null && !charSequence.toString().equals("");
});
disposable = Observable
.combineLatest(mObsPhoneVerify1, mObsPhoneVerify2, mObsPhoneVerify3, mObsPhoneVerify4,
(PhoneVerify1, PhoneVerify2, PhoneVerify3, PhoneVerify4)
-> PhoneVerify1 && PhoneVerify2 && PhoneVerify3 && PhoneVerify4)
.compose(regisObserver(false))
.subscribe(aBoolean -> {
db.btnActiveCode.setEnabled(aBoolean);
});
busDisposables.add(disposable);