我有片段A,B,C,我用add()
方法添加。
当我到达片段C时,我想回到片段A并删除B和C.
我的方法:
val backStateName = FragmentA::class.java.name
activity.fragmentManager.popBackStackImmediate(backStateName, FragmentManager.POP_BACK_STACK_INCLUSIVE)
我还在我的片段A中添加了specialTag
,所以我做了一个检查,以确保在尝试我的方法之前,片段A仍然在后面堆栈。
val fragmentToGoTo = activity.fragmentManager.findFragmentByTag(specialTag)
并且它不返回null - 这意味着片段仍然可以在后台堆栈中使用。 popBackStackImmediate
返回false。为什么呢?
答案 0 :(得分:1)
我有同样的行为。确保在与用于将其添加到后台堆栈相同的线程上调用popBackStackImmediate
。
同时确认您使用.add()
代替.replace()
无论如何,从来没有保证在做这件事时不会清除/摧毁背斜。我只使用popBackStack()
解决了这种问题,直到找到了你想要的片段。
您可以尝试以下方式:
fun popStack(tag: String) {
var isPopped = fragmentManager.popBackStackImmediate(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE)
if (!isPopped) {
fragmentManager.popBackStack()
//maybe a loop until you reached your goal.
}
}
答案 1 :(得分:0)
当您附加片段(或执行任何其他操作s.a. add / remove / detach等)时,您可以选择将其添加到名为String的Backstack:
FragmentA fragmentA = (FragmentA) fragmentManager.findFragmentByTag("A");
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (fragmentA != null) {
transaction.attach(fragmentA);
transaction.addToBackStack("attachA");
transaction.commit();
}
注意我们传递给addToBackStack()方法的“attachA”字符串。我们稍后会用它来回去。假设我们已执行其他事务 - 添加/删除/附加/分离其他一些片段。现在回到状态,我们调用了一个popBackStack()方法:
fragmentManager.popBackStack("attachA", FragmentManager.POP_BACK_STACK_INCLUSIVE);
如果后台堆栈中添加了一个名为“attachA”的事务 - 该方法将把我们带回到该状态。
关于返回案例的问题 - 您可能已经阅读了有关这些方法的文档以及它们返回的值。我更喜欢使用popBackStack(),因为它
/**
* Pop the last fragment transition from the manager's fragment
* back stack. If there is nothing to pop, false is returned.
* This function is asynchronous -- it enqueues the
* request to pop, but the action will not be performed until the application
* returns to its event loop.
*
* @param name If non-null, this is the name of a previous back state
* to look for; if found, all states up to that state will be popped. The
* {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
* the named state itself is popped. If null, only the top state is popped.
* @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
*/
public abstract void popBackStack(String name, int flags);
/**
* Like {@link #popBackStack(String, int)}, but performs the operation immediately
* inside of the call. This is like calling {@link #executePendingTransactions()}
* afterwards.
* @return Returns true if there was something popped, else false.
*/
public abstract boolean popBackStackImmediate(String name, int flags);