防止同一碎片堆叠多次(addToBackStack)

Iva*_*vic 7 android fragment android-fragments back-stack fragment-backstack

我有一个Activity与三个片段可以打电话给他们一个,Ç.Fragment 一个被称为在活动onCreate().

FragmentA fragA = new FragmentA();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.activity2_layout, fragA, "A");
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

当按下某些按钮时,会被片段BC替换,并且FragmentTransaction会调用addToBackStack().

FragmentB fragB = new FragmentB(); //or C
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.activity2_layout, fragB, "B");  //or C
transaction.addToBackStack("B"); //or C
transaction.commit();
Run Code Online (Sandbox Code Playgroud)

但是让我说我连续三次打电话给Fragment B,我怎么能阻止它自己堆叠呢?同时我希望这是可能的:B调用> C调用> B调用 - 但是当我尝试返回时我希望B只打开一次(C < B)而不是(B < C < B) .所以基本上删除第一个backStack与新的.

Abu*_*yah 12

如何从堆栈中恢复片段是否存在,这可能非常相似,你的查询.

有一种方法可以根据事务名称或commit提供的id来弹出后栈(例如,使用Fragment的类名作为Thijs已经提到过):

String backStateName = fragment.getClass().getName();
Run Code Online (Sandbox Code Playgroud)

添加到backstack:

FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(backStateName);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

弹出时:

getSupportFragmentManager().popBackStackImmediate (backStateName, 0); 
Run Code Online (Sandbox Code Playgroud)

所以在替换片段之前,我们可以检查backstack中的存在,如:

boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);

if (!fragmentPopped){ //fragment not in back stack, create it.
    ...
    ...
    ft.addToBackStack(backStateName);
    ft.commit();
}
Run Code Online (Sandbox Code Playgroud)

请查看上述问题和接受的答案以获得更多解释.