调用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
}
}
我在 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
}
}