3 回答
TA贡献1827条经验 获得超8个赞
说明:这是怎么回事?
如果我们牢记这.replace()一点.remove().add(),我们将通过文档了解这一点:
替换添加到容器中的现有片段。这本质上与调用remove(Fragment)所有当前添加的片段相同,这些片段在此处添加了相同的参数containerViewId,然后又add(int, Fragment, String)添加了相同的参数。
然后发生的事情是这样的(我在片段中添加数字以使其更清楚):
// transaction.replace(R.id.detailFragment, frag1);
Transaction.remove(null).add(frag1) // frag1 on view
// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag1).add(frag2).addToBackStack(null) // frag2 on view
// transaction.replace(R.id.detailFragment, frag3);
Transaction.remove(frag2).add(frag3) // frag3 on view
(这里所有误导性的东西开始发生)
请记住,.addToBackStack()只保存事务而不保存片段本身!所以现在我们有了frag3布局:
< press back button >
// System pops the back stack and find the following saved back entry to be reversed:
// [Transaction.remove(frag1).add(frag2)]
// so the system makes that transaction backward!!!
// tries to remove frag2 (is not there, so it ignores) and re-add(frag1)
// make notice that system doesn't realise that there's a frag3 and does nothing with it
// so it still there attached to view
Transaction.remove(null).add(frag1) //frag1, frag3 on view (OVERLAPPING)
// transaction.replace(R.id.detailFragment, frag2).addToBackStack(null);
Transaction.remove(frag3).add(frag2).addToBackStack(null) //frag2 on view
< press back button >
// system makes saved transaction backward
Transaction.remove(frag2).add(frag3) //frag3 on view
< press back button >
// no more entries in BackStack
< app exits >
可能的解决方案
考虑实现FragmentManager.BackStackChangedListener以观察后向堆栈中的更改,并在onBackStackChanged()methode中应用您的逻辑:
跟踪交易计数;
通过名称检查特定交易 FragmentTransaction.addToBackStack(String name);
等等。
TA贡献1818条经验 获得超11个赞
对!!!经过多拉头发,我终于弄清楚了如何使其正常工作。
似乎在按下后退按钮时并未从视图中删除片段[3],因此您必须手动进行操作!
首先,不要使用replace(),而要分别使用remove和add。似乎replace()无法正常工作。
下一步是重写onKeyDown方法,并在每次按下后退按钮时删除当前片段。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if (getSupportFragmentManager().getBackStackEntryCount() == 0)
{
this.finish();
return false;
}
else
{
getSupportFragmentManager().popBackStack();
removeCurrentFragment();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
public void removeCurrentFragment()
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.detailFragment);
String fragName = "NONE";
if (currentFrag!=null)
fragName = currentFrag.getClass().getSimpleName();
if (currentFrag != null)
transaction.remove(currentFrag);
transaction.commit();
}
希望这可以帮助!
- 3 回答
- 0 关注
- 444 浏览
添加回答
举报