2015-05-20 4 views
-1

Я все,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' для этих строк, потому что почти все остальное в моем приложении использует встроенное редактирование. И я не хочу отображать диалог только для двух текстовых полей.

+0

Почему вы отказались от моего вопроса? Я думаю, что он ясен и исследован. –

ответ

0

Хорошо,

Наконец, состояние гонки, которые заставляют нас думать, что EditText вернули старое значение.

Смежные вопросы