首页 > 解决方案 > 使用导航组件从 Backstack 中排除片段

问题描述

我有片段 X、A、B,并且我正在使用导航架构组件在它们之间导航。

片段 A,B 特定,但片段 X 可以是任何(C,D,...);

底部导航中的片段 A 和 B 及其“导航图标”始终在屏幕上,这意味着用户可以随时从任何片段(包括 A 和 B)转到 A 或 B:


X -> A -> B

X -> B -> A

A -> B -> X

A -> B -> A

//another ways


我对这个案例的问题:

X -> A -> B -> A -> B -> ?

如果用户从 开始X,到达?并通过“返回”按钮开始返回,他会A多次B投掷:

用户回击:

? -> B -> A -> B -> A -> X

但是如果它们已经在后台堆栈中,我想从后台“排除”片段:

? -> A -> B -> X

如果用户导航:

X -> A -> B -> A

我想看看:

A -> B -> X

不是:

A -> B -> A -> X

我正在尝试使用 Pop To 来做到这一点,但它只能以一个具体的片段返回给我。我需要返回我开始的 X 片段,而不是硬编码。包容性和单顶不是关于它的。

我不确定我是否可以使用基本的导航组件来做到这一点,所以我需要你的建议。如果我做不到,我应该使用什么方法?有什么好的做法吗?


升级版:

我正在使用全局点在片段之间导航。这就是我的导航的样子:

在此处输入图像描述

右|下链是 X,我可以使用底部导航从其中任何一个导航到未更改的片段。它是Single Activity 应用程序,导航我只使用:

   //Using global points
   findNavController(R.id.host).navigate(R.id.toLibrary)

标签: androidandroid-architecture-componentsandroid-architecture-navigation

解决方案


以下解决方案采用片段可见性技术来管理片段BackstackonBackPressed()

第一步

Fragment我们在每个被调用和调用时为其分配一个标签,以便识别哪些Fragments 已被添加到Backstack并且是 前辈。通过下面的代码,我们将标签分配给Fragment将要进行交易的 a。

 fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A OR Fragment_B OR Fragment_ANY, "A or B or ANY")
.addToBackStack(tag).commit();

请记住,您必须为要进行 Transacted 的任何 Fragment 分配一个标签

在第二

我们要去处理public void onBackPressed()

必须忽略super.onBackPressed()因为,我们不想在按下后退按钮时使用默认 onBackPressed方法来影响 Backstack(原样)。此外,我们想自己处理 Backstack。

干得好

@Override
public void onBackPressed() {
    if(isVisible("A")) { //Go some where else you wanna go }
    else if(isVisible("B")){ //Go some where else you wanna go }
    else if(isVisible("X or any"){ //Go some where else you wanna go }
    else { //Go default page }
}


public boolean isVisible(String tag){
    try {
        Fragment fragment = fragmentManager.findFragmentByTag(tag);
        if (fragment != null && fragment.isVisible())
            return true;
        else
            return false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
 }

当按下后退按钮时,我们检查哪个Fragment已经可见并将用户重定向到相应的 Predecessor Fragment

例如:A - > BA -> XX -> B

我正在将此技术用于已发布的应用程序,一切都很好。


推荐阅读