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



我在使用 jetpack 的 BottomNavBar 时遇到导航视图的问题

这就是我的流程的工作原理。

我有 4 个视图,每个视图都有重定向,例如当我在导航栏的最后一个选择中时,我有一个fragment A->fragment B,当我回到导航栏的第一个选择时,当我回到第 4 个时,它又fragment A了。我相信这是因为片段正在使用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))
}
}

它与 BottomNav 的设置无关。而是为Android制作的实现中的显式行为。我将引用并解释:

行为 在 Android 上:应用导航到目的地的顶级屏幕。将重置任何以前的用户交互和临时屏幕状态,例如滚动位置、选项卡选择和内联搜索。

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

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


如果我不清楚,这里有一个伪表示:

底部导航项#1> 片段1A>片段1B

底部导航项#2> 片段2A> 片段2B

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

相关内容

  • 没有找到相关文章

最新更新