Tar*_*w45 9 android android-fragments fragmenttransaction
我是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();
}
}
Run Code Online (Sandbox Code Playgroud)
当用户第一次按下按钮时,它的行为与我的预期相同,将新片段添加到容器中.但是,第二次用户按下按钮时容器仍然包含一个片段,而不是替换,它在现有的一个上添加新的.所以,容器里面有2个碎片,2个按下去除所有碎片.
我发现如果我删除该行
ft.addToBackStack();
Run Code Online (Sandbox Code Playgroud)
并重做像下面的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();
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是
感谢所有意见和建议.
Spi*_*idy 13
addToBackstack创建片段状态的快照.这意味着当您按下后退按钮时,实际上您将恢复到上次addToBackstack调用的状态.
在您的情况下,您添加片段.后退按钮将删除此添加的片段.当你调用replace并再次添加到backstack时,你现在在backstack上有两个状态(1.当你添加了第一个片段时,2.当你没有添加片段时).如果您使用后退按钮删除当前片段,则不要使用addToBackstack.如果要保留视图中片段的状态,请仅使用addToBackstack.
| 归档时间: |
|
| 查看次数: |
27654 次 |
| 最近记录: |