Сохранение данных в представлении во время переключения активности? - PullRequest
0 голосов
/ 26 февраля 2011

В моем приложении для Android пользователь может ввести текст в EditView и щелкнуть по кнопке, которая переводит его на другой вид деятельности, где он может выбрать контакт ..., а затем нажать кнопку, которая возвращает его к первомудействие ...

теперь проблема в том, что мне нужно передать выбранный контакт в первое действие и отобразить его (что я сделал с помощью пакета), но я не могу сохранить уже введенный текст в EditView... что я должен сделать (но текст должен быть сохранен, не пропуская его через пакет и возвращая его обратно)

спасибо:)

1 Ответ

1 голос
/ 26 февраля 2011

Текст в компоненте представления автоматически сохраняется ОС, даже после мягкого уничтожения (пользователь изменил ориентацию телефона), но не после жесткого уничтожения, пользователь нажимает кнопку «Назад», когда родительское действие было в фокусе. Поэтому, если вы не делаете что-то нестандартное, например, вызываете 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 не приведет к желаемому результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...