Текст в компоненте представления автоматически сохраняется ОС, даже после мягкого уничтожения (пользователь изменил ориентацию телефона), но не после жесткого уничтожения, пользователь нажимает кнопку «Назад», когда родительское действие было в фокусе. Поэтому, если вы не делаете что-то нестандартное, например, вызываете onSaveInstanceState без вызова super.onSaveInstanceState, данные в состоянии просмотра должны сохраняться.
Одним из решений было бы сохранить текст в компоненте представления как свойство экземпляра без представления перед запуском дочернего действия и просто прочитать это значение обратно, когда фокус возвращается к родительскому действию в методе onActivityResult.
JAL
РЕДАКТИРОВАТЬ: страница Документы для Android была обновлена. Состояние просмотра не будет сохранено, если виджет не имеет идентификатора.
РЕДАКТИРОВАТЬ: я говорю, что ОС должна сохранять состояние просмотра. Вам не нужно сохранять состояние просмотра вручную. При тяжелом убийстве вам нужно будет сохранить состояние вашей активности, ЕСЛИ это ожидаемое поведение действия. Итак, вот некоторый код, который сохраняет состояние активности. Учитывая переменную экземпляра:
String password;
Здесь мы сохраняем состояние при мягком уничтожении:
protected void onSaveInstanceState(Bundle outState){
password= editTextPassword.getText().toString();
outState.putString("password", password);
super.onSaveInstanceState(outState); // save view state
}
Здесь мы сохраняем состояние при жестком убийстве
@Override
protected void onStop(){
super.onStop();
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("password",password);
editor.commit();
Здесь мы восстанавливаем состояние в onCreate (Bundle saveInstanceState):
if( savedInstanceState!= null){ // get saved state from soft kill after first pass
try {
password= savedInstanceState.getString("password");
Log.d(TAG,"RestoredState!");
}
catch(Exception e){
Log.d(TAG,"FailedToRestoreState",e);
}
}
else { // get saved state from preferences on first pass
SharedPreferences prefs = getPreferences(MODE_PRIVATE); // singleton
if (prefs != null){
this.password= prefs.getString("password","");
Log.d(TAG,"gettingPrefs");
}
}
Log.d(TAG,"onCreate");
Также, учитывая тот факт, что IF onSaveInstanceState вызывается, он будет вызываться перед onStop, можно использовать флаги isSavedInstanceState и isSavedPreferences для записи только в prefs при принудительном уничтожении, если вы сбросите флаги в onResume как:
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume");
isSavedInstanceState= false;
isSavedPrefs= false;
}
Установка флагов в onCreate не приведет к желаемому результату.