我有片段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片段,而不是硬编码。包容性和单一顶部不是关于它。
我不确定我能用基本的导航组件做到这一点,所以我需要你的建议。如果我做不到,我应该用什么方式?它有什么好的做法吗?
UPD:
我正在使用全局点在Fragments之间导航。这就是我的导航的样子:
右边|底部链是X,我可以使用底部导航从任何一个导航到未被剪切的片段。这是单活动应用程序,导航我只使用:
//Using global points
findNavController(R.id.host).navigate(R.id.toLibrary)
在这里,我们将仔细管理我们的片段。首先,我们通过标签对片段进行签名以便以后检索或处理它们。如您所知,通过下面的代码,我们将标签添加到片段“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();
becuase我们不希望它处理后台堆栈,我们将处理它。
干得好
@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;
}
}
当发生反压时,我们检查当前可见的片段并尝试将当前视图重定向到我们想要向用户显示的其他地方。
我目前正在使用这种方法用于大型应用程序和所有优秀的.Mr.AF受让人
在fragmentTransaction而不是使用addToBackStack()或add(...)使用fragmentTransaction.replace(int containerViewId,Fragment fragment,String tag)
也许这篇文章可以帮助您解决问题:https://developer.android.com/guide/navigation/navigation-getting-started#navigation_and_the_back_stack我认为将popUpToInclusive添加到您的navigationfragment应该可以解决您的问题