我的活动有一个纵向的单窗格布局和横向的双窗格布局,使用碎片。我希望系统在方向改变后恢复所有视图,但我不知道从哪里开始。
考虑到两个方向的布局不同(但相似),这是否可能?
如果有人实施了这项服务(或至少已经尝试过),请分享您的经验。
答案 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中配置该Activityandroid: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();
从旧布局分离并附加到新布局后,问题解决了。 如果有任何错误,请纠正我:)