如何在导航架构组件中实现条件导航

时间:2018-05-23 17:14:18

标签: android android-architecture-components android-architecture-navigation

在新的Navigation架构组件中,如何实现条件导航?

目前我有一个使用LoginFragment和HomeFragment的活动。基于某个login_flag,我曾经调用MainActivity中的任一片段。由于LoginFragment只被调用一次,我已将startDestination设置为HomeFragment,导航加载此HomeFragment。有没有办法在导航加载HomeFragment之前检查login_flag。

3 个答案:

答案 0 :(得分:2)

您可以在活动中添加导航侦听器,然后根据您的条件导航到LoginFragment,如下所示:

findNavController(nav_host_fragment).addOnNavigatedListener { controller, destination ->
        when(destination.id) {
            R.id.HomeFragment-> {
             if(someCondition) {
               //Navigate to LoginFragment
             }

        }
    }

答案 1 :(得分:1)

这就是我处理conditional navigation的方式:

  1. 将HomeFragment设置为start destination
  2. 为LoginFragment创建global action

    <action
        android:id="@+id/action_global_loginFragment"
        app:destination="@id/loginFragment"
        app:launchSingleTop="false"
        app:popUpTo="@+id/nav_graph"
        app:popUpToInclusive="true" />
    
  3. 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)
        }
    }
    

答案 2 :(得分:0)

我想补充一点,有一个 codelab on 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)
)