Подтвердить что ты не робот

Обработка экрана без потери данных - 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.
    }
4b9b3361

Ответ 1

может использовать метод переопределения 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();
 }


}

Ответ 2

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

<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">

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

    android:configChanges="keyboard|keyboardHidden|orientation"

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

Ответ 6

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

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

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

Когда вы вращаете свое устройство, ваша текущая активность полностью разрушается, т.е. проходит через 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
    }