Android Jet Pack导航,setupWithNavController()重新创建片段

时间:2018-12-18 14:53:10

标签: android android-fragments kotlin navigation fragment

使用jetpack的BottomNavBar导航视图时出现问题

这就是我的流程的工作方式。

我有4个视图,每个视图都有重定向,例如,当我在导航栏的最后选择中时,我有一个fragment A-> fragment B,而当我回到第一个选择时导航栏,当我回到第4个导航栏时,再次回到fragment A。我认为这是因为,如果jetpack可以使用setupWithNavController()重新创建片段,那么它是否可以解决此问题?

这是我的代码,仅供参考。

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@+id/splashFragment">
    <fragment
        android:id="@+id/selectionFragment"
        android:name="whitecloak.com.allibuy.app.selection.SelectionFragment"
        android:label="fragment_selection"
        tools:layout="@layout/fragment_selection" >
        <action
            android:id="@+id/toLogin"
            app:destination="@id/loginFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/nav_graph" 
            app:popUpToInclusive="true/>
    </fragment>

    <fragment
       android:id="@+id/splashFragment"
       android:name="whitecloak.com.allibuy.app.splash.SplashFragment"
        android:label="fragment_splash"
        tools:layout="@layout/splash_fragment"
        >
        <action
            android:id="@+id/toMain"
            app:destination="@id/mainFragment"
            app:launchSingleTop="true"
            app:popUpTo="@+id/nav_graph"
            app:popUpToInclusive="true"/>
    </fragment>

<menu xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/splashFragment"
    android:icon="@drawable/home"
    android:title="@string/home"
    app:popUpTo="@id/nav_graph" />

<item
    android:id="@+id/tabCart"
    android:icon="@drawable/cart"
    android:title="@string/cart"
    app:popUpTo="@id/nav_graph" />

<item
    android:id="@+id/tabNotif"
    android:icon="@drawable/notification"
    android:title="@string/notification"
    app:popUpTo="@id/nav_graph"/>

<item
    android:id="@+id/selectionFragment"
    android:icon="@drawable/user"
    android:title="@string/account"
    app:popUpTo="@id/nav_graph" />

bottomNav.setupWithNavController(findNavController(R.id.nav_main))

我只包含了第一个和最后一个标签的XML。非常感谢。

编辑

class MainNavigation : DaggerAppCompatActivity() {
    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory

    private lateinit var viewModel: MainNavigationViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProviders.of(this, viewModelFactory)[MainNavigationViewModel::class.java]

        bottomNav.setupWithNavController(findNavController(R.id.nav_main))
    }

}

1 个答案:

答案 0 :(得分:0)

它与BottomNav的设置无关。而是在针对Android的实现中的显式行为。我会引用并解释:

  

行为   在Android设备上:该应用程序导航到目标的顶级屏幕。任何先前的用户交互和临时屏幕状态都会重置,例如滚动位置,选项卡选择和嵌入式搜索。

来自https://material.io/design/components/bottom-navigation.html#behavior

这意味着,当您单击BottomNav上的项目时,它应始终返回到该流程堆栈中的第一个片段。


如果我不清楚,这是伪表示:

  

BottomNavItem#1> Fragment1A> Fragment1B

     

BottomNavItem#2> Fragment2A> Fragment2B

如果您点击BottomNavItem#1,它将加载Fragment1A。然后想象一下使用按钮显示Fragment1B的情况。如果现在单击BottomNavItem#2,您将看到Fragment2A。现在,如果您点击BottomNavItem#1,它将显示Fragment1A(不是不是您上次看到的Fragment1B),因为它是该堆栈的根/流。