【问题标题】:How to make a dynamic start destination in the Android Jetpack Navigation如何在 Android Jetpack Navigation 中制作动态起始目的地
【发布时间】:2020-11-25 02:04:51
【问题描述】:

我正在构建一个 SMS 应用程序,使用来自 Android JetpackNavigation 包在屏幕之间导航。

当用户第一次打开我的应用时,他们会进入一个权限屏幕,他们需要获得默认应用权限和一些常规权限才能进入主屏幕。

当用户更改其默认 SMS 应用然后重新打开我的应用时,我还需要显示权限屏幕。

我在 Android Navigations 文档中看到了 Conditional Navigation 部分。它建议将此逻辑放在主屏幕片段onViewCreated 方法中。但我担心它会影响我的应用程序的启动时间。

有没有更有效的方法来实现这一点?理想情况下,我想在活动中处理这个逻辑。

【问题讨论】:

    标签: android navigation android-jetpack


    【解决方案1】:

    不要在 XML 文件中设置导航图。

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.fragment.app.FragmentContainerView 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/navigationHostFragmentMain"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true" />
    

    在您的Activity 中,您可以以编程方式设置起始目的地,然后设置导航图。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        setNavigationGraph()
    }
    
    private fun setNavigationGraph() {
        val navHostFragment =
            supportFragmentManager.findFragmentById(R.id.navigationHostFragmentMain) as NavHostFragment
        val navController = navHostFragment.navController
    
        val navGraph = navController.navInflater.inflate(R.navigation.navigation_graph)
        navGraph.startDestination =
            if (viewModel.isLoggedIn) {
                R.id.homeFragment
            } else {
                R.id.loginFragment
            }
    
        navController.graph = navGraph
    }
    

    【讨论】:

      【解决方案2】:

      您可以像这样以编程方式设置图形的 startDestination

      val graph = findNavController(R.id.YOUR_CONTAINER_ID).graph
      graph.startDestination = R.id.ID_OF_THE_FRAGMENT_FOR_START_DESTINATION
      findNavController(R.id.YOUR_CONTAINER_ID).setGraph(graph)
      

      这可以在你的 Activity 的 onCreate() 方法中执行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多