Обработка экрана без потери данных – Android

Я становлюсь сумасшедшим, выясняя, как лучше всего управлять поворотом экрана. Я прочитал сотни вопросов / ответов здесь, но я действительно смущен.

Как я могу сохранить данные myClass до того, как активность будет заново создана, поэтому я могу сохранить все для перерисовки без лишней инициализации?

Есть ли более чистый и лучший способ, чем просто?

Мне нужно обработать поворот, потому что я хочу изменить макет в ландшафтном режиме.

public class MtgoLifecounterActivity extends Activity { MyClass myClass; // Called when the activity is first created @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); If ( ?? first run...myClass == null ? ) { myClass = new MyClass(); } else { // do other stuff but I need myClass istance with all values. } // I want that this is called only first time. // then in case of rotation of screen, i want to restore the other instance of myClass which // is full of data. } 

Solutions Collecting From Web of "Обработка экрана без потери данных – Android"

Может использовать метод переопределения onSaveInstanceState() и onRestoreInstanceState() . Или прекратить вызов onCreate() при повороте экрана просто добавьте эту строку в манифест xml android:configChanges="keyboardHidden|orientation"

Note: ваш пользовательский класс должен реализовать пример Parcelable ниже.

 @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("obj", myClass); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); myClass=savedInstanceState.getParcelable("obj")); } public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } /** save object in parcel */ public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; /** recreate object from parcel */ private MyParcelable(Parcel in) { mData = in.readInt(); } } 

В теге активности манифеста вы должны упомянуть

 <activity android:name="com.example.ListActivity" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation"> 

Если вы используете Android 2.3 (API уровня 13) и выше, используйте

 <activity android:name="com.example.Activity" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation|screenSize"> 

Он должен работать.

Он будет работать только с тегом активности, а не с тегом приложения

Возможно, это уже решено, но только для небольшого обновления для новых участников, которые застряли на нем, просто посмотрите на сайт разработчика Google , начиная с уровня API 13, вам просто нужно добавить этот код в манифест:

 <activity android:name=".SplashScreensActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name"> Размер <activity android:name=".SplashScreensActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name"> 

Когда одна из этих конфигураций изменяется, SplashScreensActivity не перезапускается. Вместо этого SplashScreensActivity получает вызов onConfigurationChanged (). Этот метод передается объектом Configuration, который определяет новую конфигурацию устройства. Читая поля в Конфигурации, вы можете определить новую конфигурацию и внести соответствующие изменения, обновив ресурсы, используемые в вашем интерфейсе. Во время вызова этого метода объект ресурсов вашей активности обновляется для возврата ресурсов на основе новой конфигурации, поэтому вы можете легко сбрасывать элементы своего пользовательского интерфейса без перезапуска системы.

Есть два (хороших) способа об этом. Внесите свой класс в Parcelable и поместите его в пакет в onSaveInstanceState() , или, если он более сложный (например, AsyncTask), верните его в onRetainNonConfigurationInstance() .

Тогда есть и ленивый способ, когда вы просто перестаете реагировать на изменения конфигурации.

Если вам не нужно перезапускать вашу активность, просто установите для атрибута configChanges в вашей активности в AndroidManifest.xml следующее:

  android:configChanges="keyboard|keyboardHidden|orientation" 

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

Проблема здесь в том, что вы теряете «состояние» приложения. В ООП, что такое государство? Переменные! В точку! Следовательно, когда вы теряете данные своих переменных.

Теперь вот что вы можете сделать, найдите переменные, которые теряют свои состояния.

Введите описание изображения здесь

Когда вы поворачиваете свое устройство, ваша текущая активность полностью разрушается, т.е. проходит через onSaveInstanceState () onPause() onStop() onDestroy() и новое действие создается полностью, что происходит через onCreate() onStart() onRestoreInstanceState .

Два метода выделены полужирным, onSaveInstanceState () сохраняет экземпляр текущей активности, которая будет уничтожена. OnRestoreInstanceState Этот метод восстанавливает сохраненное состояние предыдущей активности. Таким образом, вы не потеряете прежнее состояние приложения.

Вот как вы используете эти методы.

  @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); outState.putString("theWord", theWord); // Saving the Variable theWord outState.putStringArrayList("fiveDefns", fiveDefns); // Saving the ArrayList fiveDefns } @Override public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) { super.onRestoreInstanceState(savedInstanceState, persistentState); theWord = savedInstanceState.getString("theWord"); // Restoring theWord fiveDefns = savedInstanceState.getStringArrayList("fiveDefns"); //Restoring fiveDefns }