返回堆叠后的片段

时间:2017-09-22 09:26:11

标签: android android-fragments kotlin

我有片段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。为什么呢?

2 个答案:

答案 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);