FragmentTransaction:replace和addToBackStack不能一起工作?

Tar*_*w45 9 android android-fragments fragmenttransaction

我是Android开发的新手,现在遇到了奇怪的行为.

  • 我有一个空的FrameLayout作为片段的容器.
  • 如果用户第一次按下按钮,则生成新的片段并放入容器内.
  • 如果用户稍后按下按钮并且容器内存在已存在的片段,则用新生成的片段替换现有片段.
  • 如果用户按下后退按钮,则弹出容器内的片段.

这是我的代码

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)

所以,我的问题是

  • 替换和addToBackStack不一起工作?
  • 或者,我做错了什么?

感谢所有意见和建议.

Spi*_*idy 13

addToBackstack创建片段状态的快照.这意味着当您按下后退按钮时,实际上您将恢复到上次addToBackstack调用的状态.

在您的情况下,您添加片段.后退按钮将删除此添加的片段.当你调用replace并再次添加到backstack时,你现在在backstack上有两个状态(1.当你添加了第一个片段时,2.当你没有添加片段时).如果您使用后退按钮删除当前片段,则不要使用addToBackstack.如果要保留视图中片段的状态,请仅使用addToBackstack.

  • Android开发者网站上的@Spidy https://developer.android.com/training/implementing-navigation/temporal.html#back-fragments他们说你应该使用addToBackStack在片段之间导航时提供适当的反向导航.你有什么理由不使用它们?2:"在你的情况下,你添加一个片段.后退按钮将删除这个添加的片段.当你调用replace,并再次添加到backstack时,你现在在backstack上有两个状态".在他的代码中他添加了一个片段?我只看到replace() (3认同)