我有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
开始,到达?
并通过“返回”按钮开始返回,则他会多次抛出A
,B
:
用户已按下:
? -> B -> A -> B -> A -> X
但是我想从堆栈中“排除”碎片,如果它们已经存在的话:
? -> A -> B -> X
如果用户导航:
X -> A -> B -> A
我想看:
A -> B -> X
不是:
A -> B -> A -> X
我正在尝试使用Pop To做它,但它只能使我返回一个具体的片段。我需要返回开始的X片段,而不是硬编码。包容性和“单身”顶部不是。
我不确定我可以使用基本的导航组件来做到这一点,所以我需要您的建议。如果我做不到,应该使用哪种方式?有什么好的做法吗?
UPD:
我正在使用全局点在片段之间导航。这就是我的导航样子:
右边的底部链是X,我可以使用底部导航从其中任何一个导航到不被搅动的片段。它是单项活动应用,仅用于导航我
//Using global points
findNavController(R.id.host).navigate(R.id.toLibrary)
答案 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添加到导航片段应该可以解决您的问题