我是Android开发的新手,现在遇到了奇怪的行为。
这是我的代码
public void showFragment(View v) {
FragmentA f = new FragmentA();
FragmentManager fm = getSupportFragmentManager();
String tag = f.getFragmentTag(); // instance method of a to get a tag
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_top, 0, 0, R.anim.slide_out_top);
ft.replace(R.id.container, f, tag);
ft.addToBackStack(tag);
ft.commit();
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
} else {
super.onBackPressed();
}
}
当用户第一次按下按钮时,它的行为与我的预期相同,将新片段添加到容器中。但是,第二次用户按下按钮时容器仍然包含一个片段,而不是替换,它在现有的一个上添加新的。 因此,容器内有2个片段,2个按下以删除所有片段。
我发现如果删除该行
ft.addToBackStack();
重新编写onBackPress()方法,如下所示,它再次像我预期的那样工作(一次在容器中有1个片段)
基本上,手动删除片段而不是popFromBackStack方法
private FragmentA currentFragment = null; // to hold the reference to exising fragment, if any.
@Override
public void onBackPressed() {
if (currentFragment != null) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(0, R.anim.slide_out_top);
ft.remove(currentFragment);
ft.commit();
currentFragment = null;
} else {
super.onBackPressed();
}
}
所以,我的问题是
感谢所有意见和建议。
答案 0 :(得分:14)
addToBackstack
创建片段状态的快照。这意味着当您按下后退按钮时,您实际上将恢复到调用addToBackstack
的最后一个状态。
在您的情况下,您添加片段。后退按钮将删除此添加的片段。当你调用replace并再次添加到backstack时,你现在在backstack上有两个状态(1.当你添加了第一个片段时,2。当你没有添加片段时)。如果您使用后退按钮删除当前片段,则不要使用addToBackstack。如果要保留视图中片段的状态,请仅使用addToBackstack。
答案 1 :(得分:-2)
对于那些仍在寻找解决方案的人。
在主Activity
类(托管片段)中,只需覆盖onBackPressed()
。
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0 ){
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
片段中没有onBackPressed()
方法,此方法仅适用于activity
。因此,当我们按后退键时,会显示activity
的默认行为,即
您将转到之前的活动(如果有)或应用程序 将退出。
现在我们需要覆盖这个方法来告诉activity
当我们按下后退键时,如果后面的堆栈中有任何片段,则将它们弹出(这是addToBackStack()
到来的时候进入图片)。否则,请遵循默认行为。
在此处here
了解更多详情