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

Как использовать 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();
        }
}
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

  • Обновите метод savedValue in onCreate() или
  • Переместите код, который использует новый метод 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();
    }
}