指定android:configChanges =“orientation”时保存状态_before_方向更改

时间:2012-02-14 03:59:58

标签: android android-layout android-orientation

我的Android应用中有一个Activity根据方向设置不同的布局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 :(得分:0)

android:configChanges="orientation"会导致您的活动在方向更改时无法重新启动,因此会跳过此常规生命周期。我建议你接受它,然后实现onRetainNonConfigurationInstance()并在onCreate或onRestoreInstanceState中恢复你的状态。有关详细信息,请参阅此article