Я все,Android, EditText.getText() возвращают старое значение
У меня есть странная проблема с двумя EditText
с используемыми для «инлайн редактирования»; они не приводят к последнему текстовому контенту:
Мой Activity
содержит SwipeView
, где каждая страница содержит TableLayout
с двумя колонками. Первая колонка - это настраиваемый компонент NameView
, который принимает два состояния: VIEW и EDIT.
Когда пользователь долго нажмите NameView
в VIEW состояния, он переключается на EDIT состояния, проявляет два EditText
(первые и фамилию). Пользователь может подтвердить или отменить свои изменения с помощью кнопок с ToolBar
или подтвердить с клавиатуры (IME DONE). VIEW состояние дисплей один TextView
, который отображает полное имя (firstName.toUpperCase()+" "+lastName
).
Все было хорошо, пока я не обнаружил, что EditText.getText().toString()
из EDIT состояния вернуть старый текст:
С NameView
в EDIT состоянии в, если изменить текст, а затем нажмите кнопку Validate из ToolBar
затем текст, возвращаемый с EditText.getText().toString()
, - это старый текст, а не тот, который я набрал. Однако, если я проверю с помощью клавиатуры (IME 'DONE'), текст будет правильным.
public class NameView implements MyAppToolbar.OnValidateListener {
private EditText edtFirstName;
private EditText edtLastName;
private void init() {
// Inject views
// bind IME done to 'onValidate'
edtLastName.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
onValidate();
return true;
}
return false;
}
});
// bind Toolbar validate to 'onValidate'
toolbar.setOnValidateListener(this);
}
public void onValidate() {
editPresenter.onValidateButtonClicked();
}
public String getFirstName() {
return edtFirstName.getText().toString();
}
public String getLastName() {
return edtLastName.getText().toString();
}
}
public class EditPresenter {
public void onValidateButtonClicked() {
User copy = new User(user.getId(), view.getFirstName(), view.getLastName());
if (validator.accept(copy)) {
// persist
} else {
view.setFirstNameInvalid(true);
view.setLastNameInvalid(true);
}
}
}
Я хотел бы использовать 'inline edit' для этих строк, потому что почти все остальное в моем приложении использует встроенное редактирование. И я не хочу отображать диалог только для двух текстовых полей.
Почему вы отказались от моего вопроса? Я думаю, что он ясен и исследован. –