Android:移动片段并添加到backstack

时间:2016-05-10 09:38:33

标签: android android-fragments

我有两个窗格布局。

我左边有一个片段,右边有一个片段。现在我想用右侧的那个替换左侧并在右侧创建一个新的(即我想移动左侧的那个,并在其上创建一个新的右):

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并还原事务来创建一个事务?

1 个答案:

答案 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();
}