Потеря данных при повороте экрана - PullRequest
33 голосов
/ 26 февраля 2011

У меня есть небольшая забавная ошибка в моем приложении. Когда пользователь поворачивает экран, я теряю некоторые данные в моей деятельности. Кто-нибудь, кто имеет представление о том, почему это происходит?

Ответы [ 10 ]

66 голосов
/ 25 мая 2012
//Use onSaveInstanceState(Bundle) and onRestoreInstanceState

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

  // Save UI state changes to the savedInstanceState.   
  // This bundle will be passed to onCreate if the process is  
  // killed and restarted.

  savedInstanceState.putBoolean("MyBoolean", true);  
  savedInstanceState.putDouble("myDouble", 1.9);  
  savedInstanceState.putInt("MyInt", 1);  
  savedInstanceState.putString("MyString", "Welcome back to Android");  

  // etc.  

  super.onSaveInstanceState(savedInstanceState);  
}  

//onRestoreInstanceState  

@Override  
public void onRestoreInstanceState(Bundle savedInstanceState) {  

  super.onRestoreInstanceState(savedInstanceState);  

  // Restore UI state from the savedInstanceState.  
  // This bundle has also been passed to onCreate.  

  boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");  
  double myDouble = savedInstanceState.getDouble("myDouble");  
  int myInt = savedInstanceState.getInt("MyInt");  
  String myString = savedInstanceState.getString("MyString");  
}

Так вы сохраняете данные, когда система удаляет их по очереди.

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

По умолчанию при повороте экрана ваша активность прерывается и перезапускается. Чтобы убедиться, что данные не потеряны, вам нужно правильно сохранить и восстановить данные, используя методы жизненного цикла. См. Сохранение постоянного состояния .

8 голосов
/ 19 апреля 2013

Самое быстрое решение, которое я нашел, это: http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

7 голосов
/ 30 мая 2015

Вот вариант полезного ответа @ jaisonDavis:

int myInt;
String myString;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_verses);


    if (savedInstanceState == null) {

        Intent intent = getIntent();
        myInt = intent.getIntExtra("MyIntIntentKey", DEFAULT_INT);
        myString = intent.getStringExtra("MyStringIntentKey", DEFAULT_STRING);

    } else { // savedInstanceState has saved values

        myInt = savedInstanceState.getInt("MyIntKey");
        myString = savedInstanceState.getString("MyStringKey");
    }

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

    savedInstanceState.putInt("MyIntKey", myInt);
    savedInstanceState.putString("MyStringKey", myString);

    super.onSaveInstanceState(savedInstanceState);
}

В этом примере переменные инициализируются с Intent при первом создании операции, но после этого они инициализируются с savedInstanceState (как при изменении ориентации).

5 голосов
/ 06 декабря 2017

В AndroidManifest.xml добавьте следующий код

<activity android:name=".MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" >

3 голосов
/ 12 декабря 2017

Подробнее

Люди уже предоставили код.Так что я собираюсь добавить более подробную информацию об этом.

Что происходит при повороте экрана?

Когда экран поворачивается, изменяется конфигурация действия, поэтому система ищет более подходящий ресурс для действия.Для этого система уничтожает экземпляр действия и воссоздает новый экземпляр действия.

Как система создает новый экземпляр?

Система пытается воссоздать экземпляр, используя набор сохраненных данных старого экземпляра Activity, известного как состояние экземпляра .InstanceState - это коллекция Key-Value Pair, хранящаяся в Bundle объекте.

Система автоматически сохраняла некоторые данные

По умолчанию система сохраняет объекты View, например, в Bundle.

  • Текст в EditText
  • Положение прокруткив ListView и т. д.

Если вы хотите сохранить больше данных, которые должны выдержать изменение ориентации.Вы должны переопределить onSaveInstanceState(Bundle savedInstanceState) метод.

Используйте onSaveInstaneState правильно

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

Так что по ошибке, если вы забудете вызвать super.onSaveInstanceState (saveInstanceState), поведение по умолчанию не будет работать, т.е. текст в EditText не сохранит,Если вы мне не верите проверьте это

Какой метод использовать для восстановления состояния?

Многие люди путаются, включая меня.Должен ли я выбрать

  • onCreate(Bundle savedInstanceState)

ИЛИ

  • onRestoreInstanceState(Bundle savedInstanceState)

Этоне имеет значения .Оба метода получают один и тот же пакет в параметре.Единственное отличие состоит в том, что вам нужно предоставить нулевую проверку методом onCreate(Bundle savedInstanceState).Но если вы собираетесь использовать onRestoreInstanceState(Bundle savedInstanceState), , используйте его осторожно

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}

Всегда вызывайте super.onRestoreInstanceState(savedInstanceState), чтобы система восстановила иерархию просмотра по умолчанию

2 голосов
/ 21 ноября 2017
setRetainInstance(true);

Используйте это на OnCreate

1 голос
/ 29 июня 2019

В AndroidManifest.xml добавьте следующий код

<activity android:name=".MainActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            >

у меня работает

1 голос
/ 01 ноября 2018

Android представила ViewModel, которая может хранить сложные объекты при повороте экрана. Класс ViewModel предназначен для хранения и управления данными, связанными с пользовательским интерфейсом, с учетом жизненного цикла. Класс ViewModel позволяет данным переживать изменения конфигурации, такие как поворот экрана.

Пожалуйста, обратитесь к документации

https://developer.android.com/topic/libraries/architecture/viewmodel

0 голосов
/ 29 июня 2019

Вы можете использовать шаблон MVVM и использовать вашу ViewModel для сохранения ваших данных.Поэтому, когда вы поворачиваете свое устройство, вы не будете беспокоиться о потере своих данных, потому что вы изолировали свои данные в ViewModel, и это означает, что ваши данные не будут затронуты жизненным циклом активности.https://developer.android.com/topic/libraries/architecture/viewmodel

...