Как использовать 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(); } } 
  • Предупреждение Google Play и OpenSSL
  • ANDROID: идентификатор электронной почты для почтового клиента электронной почты пуст в android-parse
  • Отключить прокрутку в списке
  • как реализовать фильтрацию в RealmRecyclerViewAdapter
  • Firebase Admin SDK для Android, методы не найдены
  • ListSelector применяется ко всему списку
  • Как показать диалог выбора местоположения, например, карты Google?
  • listView динамический элемент добавления
  • Как запустить onListItemClick в Listactivity с помощью кнопок в списке?
  • onOptionsItemSelected не вызывается при использовании actionLayout (SherlockActionBar)
  • Конструктор пользовательского вида Android
  • Interesting Posts

    Как resize изображения (битмап) до заданного размера?

    Символ новой строки Unicode (\ u000d) в Java

    Json.Net добавляет $ id к объектам EF, несмотря на то, что PreserveReferencesHandling указывает на “None”

    Использование углового фильтра в входном элементе

    Как Intel HD Graphics от процессоров 2010 года сравнивается с текущими низкоуровневыми видеокартами?

    Ошибка «Undefined symbols» с компоновщиком простого шаблона

    Перенаправление stdin и stdout из C

    Пустые диски показывают 2 ГБ, Explorer ничего не показывает

    Могу ли я создать загрузочный USB-флеш-накопитель Linux с помощью компьютера под управлением Windows?

    В чем разница между User Control, Custom Control и Component?

    Не удается создать точку доступа из окон 10 после обновления с Windows 8

    Запуск сценария при подключении к беспроводной сети

    Как преобразовать Bitmap в Drawable в Android?

    Может ли кто-нибудь объяснить IEnumerable и IEnumerator для меня?

    Почему конверсия туда и обратно с помощью строки, небезопасной для двойной?

    Давайте будем гением компьютера.