Я закончил ее с той же проблемой, и я не мог использовать решение с onEditorAction или onFocusChange и не хотел пробовать таймер.Таймер слишком опасен для вкуса из-за всех потоков и слишком непредсказуем, поскольку вы не знаете, когда выполняется код.
OnEditorAction не перехватывает, когда пользователь уходит без использования кнопки и еслипожалуйста, обратите внимание, что KeyEvent может быть нулевым.Фокус ненадежен на обоих концах, пользователь может получить фокус и оставить без ввода текста или выбора поля, и пользователю не нужно оставлять последнее поле EditText.
Мое решение использует onFocusChange и флаг, установленный, когдапользователь начинает редактировать текст и функцию для получения текста из последнего сфокусированного представления, которое я вызываю при необходимости.
Я просто очищаю фокус на всех моих текстовых полях, чтобы обмануть код представления оставленного текста, ClearFocusкод выполняется только в том случае, если поле имеет фокус.Я вызываю функцию в onSaveInstanceState, поэтому мне не нужно сохранять флаг (mEditing) в качестве состояния представления EditText и при нажатии важных кнопок и при закрытии действия.
Будьте осторожны с TexWatcher, так как он часто вызывается. Я использую условие для фокуса, чтобы не реагировать, когда код onRestoreInstanceState вводит текст.Я
final EditText mEditTextView = (EditText) getView();
mEditTextView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!mEditing && mEditTextView.hasFocus()) {
mEditing = true;
}
}
});
mEditTextView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus && mEditing) {
mEditing = false;
///Do the thing
}
}
});
protected void saveLastOpenField(){
for (EditText view:getFields()){
view.clearFocus();
}
}