Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用导航组件从Backback中解开碎片_Android_Android Architecture Components_Android Architecture Navigation - Fatal编程技术网

Android 使用导航组件从Backback中解开碎片

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片段,我使用导航架构组件在它们之间导航

片段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

但我想从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我用单一活动应用程序进行了测试,效果很好。任何问题都可以与我分享。