【问题标题】:Android Navigation Component how to open new fragment without adding it to backStack?Android导航组件如何打开新片段而不将其添加到backStack?
【发布时间】:2020-11-12 11:33:14
【问题描述】:

我正在使用导航组件 (JetPack) 进行导航。我想打开一个新的片段 R.id.twoFragment :

navController.navigate(R.id.twoFragment)

但我需要 R.id.twoFragment 不进入 backStack。我该怎么做?

【问题讨论】:

    标签: android kotlin android-navigation


    【解决方案1】:

    这两行让这个技巧奏效:

    app:popUpTo="@id/fragmentA"
    app:popUpToInclusive="true"
    

    如果你想从 A 走到 B 并期望完成 A:

    您需要通过此操作调用 B:

    <fragment
        android:id="@+id/fragmentA"            
        tools:layout="@layout/fragment_a">
    
        <action
            android:id="@+id/action_call_B"
            app:destination="@+id/fragmentB"
            app:popUpTo="@id/fragmentA"
            app:popUpToInclusive="true" />
    
    </fragment>
    
    <fragment
        android:id="@+id/fragmentB"
        tools:layout="@layout/fragment_b">
    
    
    </fragment>
    

    如果你把日志放到你的片段中,你可以看到片段A在使用这个动作调用片段B之后被销毁了。

    指向问题 - 据我所知,如果不将片段 B 添加到后台堆栈,则无法添加片段 B。当您调用操作时,它会自动添加

    【讨论】:

      【解决方案2】:

      您必须编辑您的navigation graph,选择action(两个片段之间的连接)并设置属性popUpTo 以指示按下后退按钮时的去向,所以:

      之后,一定要使用action在fragment之间移动而不是实际fragment的ID:

      navController.navigate(R.id.actionFragmentAtoFragmentB)
      

      例如,您可以将第三个片段弹出到第一个片段而不是第二个片段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多