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

Sha*_*ran 8 android android-architecture-components android-architecture-navigation

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

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

max*_*oin 7

这就是我处理条件导航的方式

  1. 将 HomeFragment 设置为起始目的地
  2. 为 LoginFragment创建全局操作

    <action
        android:id="@+id/action_global_loginFragment"
        app:destination="@id/loginFragment"
        app:launchSingleTop="false"
        app:popUpTo="@+id/nav_graph"
        app:popUpToInclusive="true" />
    
    Run Code Online (Sandbox Code Playgroud)
  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)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • @AleksN。是的,您需要定义多个“主页”目的地,以便导航组件知道没有什么可返回的。将登录屏幕添加到目标组中。请参阅 /sf/answers/3737354071/。 (2认同)

Ale*_*lex 3

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

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

        }
    }
Run Code Online (Sandbox Code Playgroud)