Как использовать onSaveInstanceState () и onRestoreInstanceState ()?

Я пытаюсь сохранить данные в изменении ориентации. Как показано в приведенном ниже коде, я использую onSaveInstanceState() и onRestoreInstanceState() . Я пытаюсь получить сохраненное значение, и я проверяю, является ли оно правильным значением в onRestoreInstanceState() . Но когда я пытаюсь использовать новое значение в onCreate() , у меня нет нового значения, кроме старого.

 protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("TEXT", user); } protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); savedUser = savedInstanceState.getString("TEXT"); Log.d("enregistred value", savedUser); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int display_mode = getResources().getConfiguration().orientation; if (display_mode == 1) { setContentView(R.layout.main_grid); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); mGrid.setVisibility(0x00000000); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } else { setContentView(R.layout.main_grid_land); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); Log.d("Mode", "land"); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } Log.d("savedUser", savedUser); if (savedUser.equals("admin")) { //value 0 adapter.setApps(appManager.getApplications()); } else if (savedUser.equals("prof")) { //value 1 adapter.setApps(appManager.getTeacherApplications()); } else {// default value appManager = new ApplicationManager(this, getPackageManager()); appManager.loadApplications(true); bindApplications(); } } 

Когда ваша деятельность воссоздается после того, как она была ранее уничтожена, вы можете восстановить сохраненное состояние из пакета, который система передает вашу активность. Оба метода обратного вызова onCreate () и onRestoreInstanceState () получают тот же Bundle, который содержит информацию о состоянии экземпляра.

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

 static final String STATE_USER = "user"; private String mUser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Check whether we're recreating a previously destroyed instance if (savedInstanceState != null) { // Restore value of members from saved state mUser = savedInstanceState.getString(STATE_USER); } else { // Probably initialize members with default values for a new instance mUser = "NewUser"; } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putString(STATE_USER, mUser); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); } 

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

  • onSaveInstanceState() – метод, используемый для хранения данных перед приостановкой действия.

Описание: Крюк, позволяющий представлению создать представление своего внутреннего состояния, которое впоследствии может быть использовано для создания нового экземпляра с этим же состоянием. Это состояние должно содержать только информацию, которая не является постоянной или не может быть восстановлена ​​позже. Например, вы никогда не сохраните текущую позицию на экране, потому что это будет вычислено снова, когда новый экземпляр представления будет помещен в его иерархию представлений.

  • onRestoreInstanceState() – это метод, используемый для восстановления данных.

Описание: Этот метод вызывается после onStart (), когда активность повторно инициализируется из ранее сохраненного состояния, указанного здесь в файле savedInstanceState. Большинство реализаций просто используют onCreate (Bundle) для восстановления своего состояния, но иногда удобно делать это здесь после завершения инициализации или разрешать подclassам решать, использовать ли вашу реализацию по умолчанию. По умолчанию реализация этого метода выполняет восстановление любого состояния представления, которое ранее было заморожено onSaveInstanceState (Bundle).

Рассмотрим этот пример здесь:
У вас есть 3 windows редактирования, в которых пользователь вводит некоторую информацию, но он получает звонок, поэтому, если вы не использовали вышеуказанные методы, то все, что он ввел, будет потеряно.
Поэтому всегда сохраняйте текущие данные в onPause() методе Activity как метод bundle & in onResume() вызывающий метод onRestoreInstanceState() .

Пожалуйста, посмотри :

Как использовать пример onSavedInstanceState пожалуйста

http://www.how-to-develop-android-apps.com/tag/onrestoreinstancestate/

Это происходит потому, что вы используете savedValue в onCreate() . savedValue обновляется в onRestoreInstanceState() , но onRestoreInstanceState() вызывается после onCreate() . Вы также можете:

  1. Обновите метод savedValue в onCreate() или
  2. Переместите код, который использует новый savedValue в onRestoreInstanceState() .

Но я предлагаю вам использовать первый подход, создав код следующим образом:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int display_mode = getResources().getConfiguration().orientation; if (display_mode == 1) { setContentView(R.layout.main_grid); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); mGrid.setVisibility(0x00000000); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } else { setContentView(R.layout.main_grid_land); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); Log.d("Mode", "land"); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } if (savedInstanceState != null) { savedUser = savedInstanceState.getString("TEXT"); } else { savedUser = "" } Log.d("savedUser", savedUser); if (savedUser.equals("admin")) { //value 0 adapter.setApps(appManager.getApplications()); } else if (savedUser.equals("prof")) { //value 1 adapter.setApps(appManager.getTeacherApplications()); } else {// default value appManager = new ApplicationManager(this, getPackageManager()); appManager.loadApplications(true); bindApplications(); } } 
  • MAT (Eclipse Memory Analyzer) - как просматривать растровые изображения из дампа памяти
  • Скрытие строк в Obfuscated code
  • Как программно сделать снимок экрана?
  • Что такое «точка» для регистрации активности
  • Подписание Android с Ant
  • Как запретить Android делать снимок экрана, когда мое приложение переходит на задний план?
  • В чем разница между @ + id / android: list и @ + id / list
  • Ошибка AsyncTask и Looper.prepare ()
  • Как выполнять задачу Async повторно после фиксированных интервалов времени
  • Как написать стиль в текст ошибки EditText в Android?
  • Android Studio «Структура проекта» не подходит должным образом
  • Давайте будем гением компьютера.