我有两个窗格布局。
我左边有一个片段,右边有一个片段。现在我想用右侧的那个替换左侧并在右侧创建一个新的(即我想移动左侧的那个,并在其上创建一个新的右):
private FragmentManager fm; // assigned in onCreate
private MyListFragment rightSide; // assigned in onCreate
public void onClicked(Fragment fragment) { // callback
fm.beginTransaction().replace(R.id.left_side, rightSide).commit();
leftSide = rightSide;
rightSide = MyListFragment.newInstance();
fm.beginTransaction().replace(R.id.right_side, rightSide).commit();
}
现在,我得到一个IllegalStateException
:
java.lang.IllegalStateException: Can't change container ID of fragment MyListFragment{300c6aae #1 id=0x7f070094}: was 2131165332 now 2131165331
我可以通过
来规避这种情况fm.popBackStackImmediate(null, fm.POP_BACK_STACK_INCLUSIVE);
fm.beginTransaction().remove(rightSide).commit();
fm.executePendingTransactions();
但我也希望能够将它添加到后台。当我按下时,我想删除右侧的那个并将左侧的那个移回右侧。
如何通过将其添加到Backstack并还原事务来创建一个事务?
答案 0 :(得分:0)
在一次交易中完成所有操作,然后在按下后退按钮时调用addToBackStack()
撤消整个事情:
private FragmentManager fm; // assigned in onCreate
private MyListFragment rightSide; // assigned in onCreate
public void onClicked(Fragment fragment) { // callback
MyListFragment newRightSide = MyListFragment.newInstance();
fm.beginTransaction()
.remove(rightSide)
.replace(R.id.left_side, rightSide)
.replace(R.id.right_side, newRightSide)
.addToBackStack(null)
.commit();
}