我有Activity
有三个片段,我们称之为 A , B 和 C 。在活动Fragment
中调用onCreate()
A 。
FragmentA fragA = new FragmentA();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.activity2_layout, fragA, "A");
transaction.commit();
当按下某些按钮时,会被Fragment B 或 C 取代,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();
但是我可以说连续三次拨打Fragment
B ,我怎样才能防止它自行堆叠?同时我希望这是可能的: B 调用> C 调用> B 被叫 - 但是当我尝试回去时我想要 B 只打开一次( C < B )而不是( B < C < B )。所以基本上删除第一个带有新的backStack。
答案 0 :(得分:12)
来自How to resume Fragment from BackStack if exists,这可能与您的查询非常相似。
有一种方法可以根据事务名称或commit提供的id弹出后台堆栈(例如,使用Fragment的类名作为 Thijs已经提到了):
String backStateName = fragment.getClass().getName();
添加到backstack:
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack(backStateName);
ft.commit();
弹出时:
getSupportFragmentManager().popBackStackImmediate (backStateName, 0);
所以在替换片段之前,我们可以检查backstack中的存在,如:
boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
if (!fragmentPopped){ //fragment not in back stack, create it.
...
...
ft.addToBackStack(backStateName);
ft.commit();
}
请查看上述问题和接受的答案以获得更多解释。
答案 1 :(得分:1)
我刚刚在我自己的一个项目中解决了你的一个问题,即how can I prevent it from stacking on to it self?
。这是我在那里使用的确切代码:
public void setContent(@NonNull Fragment fragment, boolean addToBackStack) {
Fragment current = getSupportFragmentManager().findFragmentById(R.id.main_content);
if (current == null || !current.getClass().equals(fragment.getClass())) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (addToBackStack) {
transaction.addToBackStack(null).add(R.id.main_content, fragment).commit();
} else {
transaction.replace(R.id.main_content, fragment).commit();
}
}
}
此代码的作用是检查当前显示的片段是什么类,并将其与要替换它的片段进行比较。如果它们是相同的,它就不会做任何事情。这段代码可以根据您的需求进行调整
Fragment newFragment = new FragmentB(); //OR FragmentC
Fragment current = getSupportFragmentManager().findFragmentById(R.id.activity2_layout);
if (!current.getClass().equals(newFragment.getClass())) {
//POP BACKSTACK HERE LIKE EXPLAINED BELOW
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
final String tag = newFragment.getClass().getSimpleName();
transaction.addToBackStack(tag);
transaction.add(R.id.activity2_layout, newFragment, tag);
transaction.commit();
} else {
//THROW AN ERROR OR SOMETHING, HANDLE IT BEING THE SAME
}
确保一次只能存在某种类型的某个片段,这可能是通过弹出后台直到第一次出现相同片段之前实现的。我没有为此编写任何代码,但实现该功能不应该太难。如果您无法自己弄清楚,请告诉我,我会尝试给您举个例子:)