如果活动布局更改,则在配置更改后恢复片段状态

时间:2013-03-01 22:49:32

标签: android android-layout android-fragments android-configchanges

我的活动有一个纵向的单窗格布局和横向的双窗格布局,使用碎片。我希望系统在方向改变后恢复所有视图,但我不知道从哪里开始。

考虑到两个方向的布局不同(但相似),这是否可能?

如果有人实施了这项服务(或至少已经尝试过),请分享您的经验。

3 个答案:

答案 0 :(得分:2)

我建议您在 onCreate 方法中使用带有 setRetainInstance(true)的片段。这使得片段在Activity配置更改中保留其成员变量。请阅读此博客文章,其中解释了您需要的信息: http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

答案 1 :(得分:1)

@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }

您可以在此后使用:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
            // Restore last state for checked position.
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }
}

答案 2 :(得分:1)

也许我知道问题所在。希望我的回答能帮助有人想解决这个问题。 如果您的Activity中有片段,您可以使用

在AndroidManifest.xml中配置该Activity
android:configChanges="keyboardHidden|orientation|screenSize"

然后,您希望在触发onConfigurationChanged时更改活动的布局。一旦活动膨胀新布局或使用setContentView(R.layout.new_layout);,片段将消失,但是,该片段仍然在运行并且从视图中消失。

所以问题是片段是附加到以前的布局,你需要做什么:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
if (fm.findFragmentById(R.id.pane_list) == null) {
    // instantiate fragment and add to view
    mFragment = new ItemFragment();
    transaction.add(R.id.pane_list, mFragment );
} else {
    // fragment already exists, we re-attahced it
    mFragment = fm.findFragmentById(R.id.pane_list);
    transaction.detach(mFragment);
    transaction.attach(mFragment);
}
transaction.commit();

从旧布局分离并附加到新布局后,问题解决了。 如果有任何错误,请纠正我:)