Сохранение состояния _before_ изменение ориентации, когда указан android: configChanges = "direction" - PullRequest
1 голос
/ 14 февраля 2012

У меня есть Activity в моем приложении для Android, которое устанавливает различные XML-разметки в качестве вида в зависимости от ориентации. Я объявил android:configChanges="orientation" в манифесте. Теперь вызывается onConfigurationChanged(), но к этому времени новая ориентация уже вступила в силу.

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

Я взломал это следующим образом, но я не уверен, что это правильный способ сделать это. Моя процедура включает в себя сохранение состояния в onConfigurationChanged(), а затем вызов setContentView(), чтобы установить макет для новой ориентации.

public class SwitchOrientationActivity extends Activity {

    private View mLandscape, mPortrait;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LayoutInflater li = LayoutInflater.from(this);
        mLandscape = li.inflate(R.layout.landscape, null);
        mPortrait = li.inflate(R.layout.portrait, null);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        if (Configuration.ORIENTATION_LANDSCAPE == newConfig.orientation) {
            switchToLandscape();
        } else {
            switchToPortrait();
        }
    }

    private void switchToPortrait() {

        /*
         * Use mLandscape.findViewById() to get to the views and save the values
         * I'm interested in.
         */
        saveLanscapeState();
        setContentView(mPortrait);
    }

    private void switchToLandscape() {
        /*
         * Use mPortrait.findViewById() to get to the views and save the values
         * I'm interested in.
         */
        savePortraitState();
        setContentView(mLandscape);

    }
}

Есть ли более элегантный способ добиться этого?

1 Ответ

0 голосов
/ 14 февраля 2012

android:configChanges="orientation" приводит к тому, что ваша активность не перезапускается при изменении ориентации, и поэтому пропускает обычный жизненный цикл для этого. Я бы посоветовал вам убрать это, затем реализовать onRetainNonConfigurationInstance () и восстановить ваше состояние либо в onCreate, либо в onRestoreInstanceState. См. статью для получения дополнительной информации

...