我目前正在尝试在方向更改后重用已创建的片段。我在平板电脑上的布局包含 3列。 第一个是一个简单的导航抽屉,第二个是一个列表,第三个是列表中所选项目的详细信息视图。
我的目标是在从横向到纵向到横向的方向更改后记住列表中的选定项目。在纵向模式下,不显示选择。
看看我的代码:
mListFragment = (RecordingListFragment) fm.findFragmentByTag("tag");
if(mListFragment == null) {
mListFragment = new RecordingListFragment();
}
if(mDetailsFragment == null) {
mDetailsFragment = new RecordingDetailFragment();
}
// phone
if(!mTwoPanelsUsed) {
// pop from back stack or create
if(!fm.popBackStackImmediate(BACK_STACK_STATE_LIST, 0)) {
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content_frame, mListFragment, "tag");
ft.addToBackStack(BACK_STACK_STATE_LIST);
ft.commit();
}
// tablet
} else {
// container got invisible in other cases, so make visible again
findViewById(R.id.container_2).setVisibility(View.VISIBLE);
// pop from back stack or create
if(!fm.popBackStackImmediate(BACK_STACK_STATE_LIST_AND_DETAILS, 0)) {
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container_1, mListFragment, "tag");
ft.replace(R.id.container_2, mDetailsFragment);
ft.addToBackStack(BACK_STACK_STATE_LIST_AND_DETAILS);
ft.commit();
}
}
// store index pressed in navigation drawer for back button navigation
mNavigationDrawerActivatedHistory.push(NAVIGATION_RECORDINGS);
mDrawerNavigationPosition = NAVIGATION_RECORDINGS;
通过执行此操作,我得到了行
的运行时异常ft.replace(R.id.content_frame, mListFragment, "tag");
命名:
引起:java.lang.IllegalStateException:无法更改容器ID 片段RecordingListFragment {d0e629e#1 id = 0x7f0a0043 tag}:是 2131361859现在2131361856
我已经阅读过有关删除片段然后执行executePendingTransactions的内容。将代码更改为
if(mListFragment == null) {
mListFragment = new RecordingListFragment();
} else {
fm.beginTransaction().remove(mListFragment).commit();
fm.executePendingTransactions();
}
导致另一个例外:
无法开始活动 ComponentInfo {com.iav.viraprecorder / com.iav.viraprecorder.VIRAPRecorderActivity}: java.lang.IllegalStateException:递归进入 executePendingTransactions
如何恢复片段的状态? (我不想使用retainInstance事件)
谢谢!