调用popbackstack()后,所有添加的片段都显示出来了,为什么?

After called popbackstack(),all the added fragments shows up, why?

我在 MainActivity 中有 3 个片段 A、B、C。

A、B、C 扩展 BaseFragment:

class BaseFragment extents Fragment{
  public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    Log.d("onHiddenChanged:",this.getClass().getName()+" hidden:"+hidden);    
    }
    ...
}

然后在 MainActiviy 中这样:

class MainActiviy extents Activity{
   onCreate(){
     ...
     fragmentTransaction.add(android.R.id.content, fragmentA, fragmentA.getClass().getName());
     fragmentTransaction.addToBackStack(fragmentA.getClass().getName());
     fragmentTransaction.commit();

     ...

  }
}

当点击fragmentA时,进入fragmentB(只需添加B隐藏A,并将B添加到BackStack):

fragmentTransaction.add(android.R.id.content, fragmentB, fragmentB.getClass().getName());
fragmentTransaction.addToBackStack(fragmentB.getClass().getName());
fragmentTransaction.hide(fragmentA).commit();

当点击fragmentB时,进入到fragmentC,同上。

所以,我输入A,输入B,输入C,然后在FragmentC中,我按下返回键, 我注意到,所有添加的片段都显示了:

onHiddenChanged:FragmentB
onHiddenChanged:FragmentA

这不是我的期望。当我在 FragnmentC 中按下 BackButton 时,我只想显示 FragmentB,而 FragmentA 保持隐藏状态。

因为您添加所有片段而不是替换。

我建议您使用此方法,而不是添加新片段并隐藏旧片段。

private void changeFragment(Fragment frag, boolean saveInBackstack) {
    String backStateName = ((Object) frag).getClass().getName();

    try {
        FragmentManager manager = getSupportFragmentManager();

        if (manager.findFragmentByTag(backStateName) == null) {
            //fragment not in back stack, create it.
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.container, frag, backStateName);

            if (saveInBackstack) {
                Log.d(TAG, "Change Fragment: addToBackTack " + backStateName);
                transaction.addToBackStack(backStateName);
            } else {
                Log.d(TAG, "Change Fragment: NO addToBackTack");
            }

            transaction.commit();
        } else {
            manager.popBackStack();
        }
    } catch (IllegalStateException exception) {
        Log.w(TAG, "Unable to commit fragment, could be activity as been killed in
    }
}