在新的 Navigation 架构组件中,如何实现条件导航?
目前,我有一个使用 LoginFragment 和 HomeFragment 的活动。基于某个 login_flag,我曾经从 MainActivity 调用任一片段。由于只调用了一次 LoginFragment,因此我将 startDestination 设置为 HomeFragment,并且导航会加载此 HomeFragment。有没有办法在导航加载 HomeFragment 之前检查 login_flag。
在新的 Navigation 架构组件中,如何实现条件导航?
目前,我有一个使用 LoginFragment 和 HomeFragment 的活动。基于某个 login_flag,我曾经从 MainActivity 调用任一片段。由于只调用了一次 LoginFragment,因此我将 startDestination 设置为 HomeFragment,并且导航会加载此 HomeFragment。有没有办法在导航加载 HomeFragment 之前检查 login_flag。
这就是我处理条件导航的方式:
为 LoginFragment创建一个全局操作
<action
android:id="@+id/action_global_loginFragment"
app:destination="@id/loginFragment"
app:launchSingleTop="false"
app:popUpTo="@+id/nav_graph"
app:popUpToInclusive="true" />
在里面执行条件导航onViewCreated
:
// HomeFragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if(!appAuth.isAuthenticated()) {
view.findNavController().navigate(R.id.action_global_loginFragment)
}
}
您可以在活动中添加导航侦听器,然后根据您的条件从那里导航到 LoginFragment,如下所示:
findNavController(nav_host_fragment).addOnNavigatedListener { controller, destination ->
when(destination.id) {
R.id.HomeFragment-> {
if(someCondition) {
//Navigate to LoginFragment
}
}
}
我想补充一点,developer.android.com 上有一个用于此目的的代码实验室。
在所有必需的片段中,您定义一个“next_action”(ID 显然不必是唯一的),如下所示:
<action
android:id="@+id/next_action"
app:popUpTo="@id/home_dest">
</action>
然后,有条件地,您可以在代码中设置 onClickListeners:
view.findViewById<Button>(R.id.navigate_action_button)?.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.next_action, null)
)