Android 使用导航组件从Backback中解开碎片
我有X、A、B片段,我使用导航架构组件在它们之间导航 片段A、B具有特异性,但片段X可以是任何(C、D,…) 底部导航中的片段A和B及其“导航图标”始终显示在屏幕上,这意味着用户可以随时从任何片段(包括A和B)转到A或B:Android 使用导航组件从Backback中解开碎片,android,android-architecture-components,android-architecture-navigation,Android,Android Architecture Components,Android Architecture Navigation,我有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 //另一种方式 我的问题是: X->A->B->A->B->? 如果用户从X开始,到达?并通过“后退”按钮开始返回,他会多次抛出A,B: 用户按下返回键: ?->B->A->B->A->X 但我想从Backb
X->A->B
X->B->A
A->B->X
A->B->A
//另一种方式
我的问题是:
X->A->B->A->B->?
如果用户从X
开始,到达?
并通过“后退”按钮开始返回,他会多次抛出A
,B
:
用户按下返回键:
?->B->A->B->A->X
但我想从Backback中“排除”已经存在的片段:
?->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)
在fragmentTransaction中,而不是使用addToBackStack()或add(…)使用fragmentTransaction.replace(int-ContainerServiceWid,Fragment Fragment,String tag)以下解决方案采用片段可见性技术以便在
onBackPressed()时管理片段backbackbackback
第一步
调用和调用每个片段时,我们为其分配一个标记,以便能够识别哪些片段已添加到Backstack
,哪些是前辈。
通过下面的代码,我们将一个标记分配给将要处理的片段
fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A OR Fragment_B OR Fragment_ANY, "A or B or ANY")
.addToBackStack(tag).commit();
请记住,您必须为要处理的任何片段分配一个标记
fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A OR Fragment_B OR Fragment_ANY, "A or B or ANY")
.addToBackStack(tag).commit();
第二
我们将处理public void onBackPressed()
您必须忽略super.onBackPressed()
,因为我们不希望在按下后退按钮时取消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;
}
}
当按下后退按钮时,我们检查哪个片段
已经可见,并将用户重定向到相应的前置片段
例如:A->B
或A->X
或X->B
我将此技术用于已发布的应用程序,一切都很好。哦,我没有使用fragmentTransaction
。我向问题添加了更多信息。您得到答案了吗?或者我确实帮了你。不,我没有。如果你能帮忙,那就太好了。当然。但是让我仔细看看你的问题。不用担心。谢谢你的回答。这很好,但我需要时间仔细地测试一下,因为你的提议在我目前的逻辑上被破坏了很多。我有一个单一的活动应用程序,所以我在onBackPressed()
handle或片段可见性检查方面有一些问题。我会测试它并写下结果@KirstenLy我用单一活动应用程序进行了测试,效果很好。任何问题都可以与我分享。