2

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

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

如果有人实现了这个(或至少尝试过),请分享你的经验。

4

3 回答 3

2

也许我知道问题出在哪里。希望我的回答可以帮助想要解决此类问题的人。如果您的 Activity 中有 Fragment,请在 AndroidManifest.xml 中配置该 Activity

android:configChanges="keyboardHidden|orientation|screenSize"

然后,您想在onConfigurationChanged触发时更改 Activity 的布局。一旦 Activity 为新布局充气或使用setContentView(R.layout.new_layout);,该片段将消失,但是,该片段仍在运行并从视图中消失。

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

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();

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

于 2013-06-02T11:48:09.850 回答
2

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

于 2013-08-19T14:17:01.143 回答
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);
        }
}
于 2013-03-01T23:00:35.567 回答