使用导航组件从Backstack清除片段

时间:2019-04-21 06:41:53

标签: android android-architecture-components android-architecture-navigation

我有X,A,B片段,我正在使用导航体系结构组件在它们之间导航。

特定于片段A,B,但是片段X可以是any(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开始,到达?并通过“返回”按钮开始返回,则他会多次抛出AB

用户已按下:

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

但是我想从堆栈中“排除”碎片,如果它们已经存在的话:

? -> A -> B -> X

如果用户导航:

X -> A -> B -> A

我想看:

A -> B -> X

不是:

A -> B -> A -> X

我正在尝试使用Pop To做它,但它只能使我返回一个具体的片段。我需要返回开始的X片段,而不是硬编码。包容性和“单身”顶部不是。

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


UPD:

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

enter image description here

右边的底部链是X,我可以使用底部导航从其中任何一个导航到不被搅动的片段。它是单项活动应用,仅用于导航我

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

3 个答案:

答案 0 :(得分:1)

在这里,我们将仔细管理片段。首先,我们用标签对片段进行签名,以便以后检索或处理它们。 如您所知,通过下面的代码,我们将标签添加到片段中:“ X ”(可以是任何片段)和“ A ”,最后是“ B

 fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A_or_B_or_Any, "A or B or X")
.addToBackStack(tag).commit();

请记住,您必须在交易的任何片段上签名

下一步是处理public void onBackPressed()

您必须忽略super.onBackPressed();,因为我们不想使用它来处理后向堆栈,而我们将要处理它。

你在这里

@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;
        }
}

发生后退时,我们检查哪个片段当前可见,并尝试将“当前”视图重定向到我们想要显示给用户的其他位置。

我目前正在将这种方法用于大型应用程序和所有优秀的.AF先生受赠人

答案 1 :(得分:0)

在fragmentTransaction中,而不是使用addToBackStack()或add(...),请使用fragmentTransaction.replace(int containerViewId,Fragment片段,String标记)

答案 2 :(得分:0)

也许这篇文章可以帮助您解决问题:https://developer.android.com/guide/navigation/navigation-getting-started#navigation_and_the_back_stack 我认为将popUpToInclusive添加到导航片段应该可以解决您的问题