代码之家  ›  专栏  ›  技术社区  ›  Anmol

为什么addDefaultArguments()从导航组件1.0.0-alpha09版本中删除?从活动将arg传递到StartDestination的解决方法是什么?

  •  3
  • Anmol  · 技术社区  · 6 年前

    您好,我正在研究导航体系结构组件,我正在为我的活动编程设置NavHostFragment。

    主活动.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <fragment
            android:id="@+id/nav_host"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
         />
    </android.support.constraint.ConstraintLayout>
    

    维护活动 :

    package com.andor.navigate.demonavigation
    
    import android.os.Bundle
    import android.support.v7.app.AppCompatActivity
    import androidx.navigation.Navigation
    import androidx.navigation.fragment.NavHostFragment
    import androidx.navigation.ui.NavigationUI
    import kotlinx.android.synthetic.main.activity_main.*
    
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            setupNavigation()
            NavigationUI.setupActionBarWithNavController(this, NavHostFragment.findNavController(nav_host))
    
        }
    
        override fun onSupportNavigateUp(): Boolean = Navigation.findNavController(
            this,
            R.id.nav_host
        ).navigateUp()
    
        private fun setupNavigation() {
            val navHostFragment = nav_host as NavHostFragment
            val navController = navHostFragment.navController
            val navInflater = navController.navInflater
            val graph = navInflater.inflate(R.navigation.nav_graph)
            graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination
            navHostFragment.navController.graph = graph
        }
    }
    

    问题 :

    我使用上面的代码很长时间了,但是我更新了我的gradle依赖版本 android.arch.navigation:navigation 1.0.0-alpha08 1.0.0-alpha09 在下面的代码行中更新之后,我得到编译时错误:

    代码:

    graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination
    

    错误:

    未解析的引用:addDefaultArguments

    依赖项(项目等级文件) :

    dependencies {
    
        def nav_version = "1.0.0-alpha09"
    
        implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
        implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin}
    }
    

    当我回到导航版本时 1.0.0-字母08 一切正常很好。为了谷歌删除addDefaultArguments的原因 NavDestination 在alpha09版本中。

    有人知道为什么addDefaultArguments方法被删除了吗?

    更新:

    从活动将arg传递到StartDestination的解决方法是什么?

    检查 thread 关于这个问题的更多细节,基本上我想找到一种方法,将参数从我的导航片段宿主活动发送到我的startDestination。

    以前 1.0.0-字母09 :

    只有 Solution 我能找到正在使用 addDefaultArguments()

    之后 1.0.0-字母09 不知道???

    如果有任何解决这个问题的办法,请分享!

    1 回复  |  直到 6 年前
        1
  •  3
  •   Alex    6 年前

    我检查了源代码,发现导航目的地和参数有很多变化。 我认为将默认参数传递给导航图的正确方法如下:

    val navHostFragment = nav_host as NavHostFragment
    val navController = navHostFragment.navController
    val navInflater = navController.navInflater
    val graph = navInflater.inflate(R.navigation.nav_graph)
    if(intent.extras!=null) {
        val argument1 = intent.extras.get("Key1")
        val argument2 = intent.extras.get("Key1")
        val navArgument1=NavArgument.Builder().setDefaultValue(argument1).build()
        val navArgument2=NavArgument.Builder().setDefaultValue(argument2).build()
        graph.addArgument("Key1",navArgument1)
        graph.addArgument("Key2",navArgument2)
    }
    navHostFragment.navController.graph = graph
    

    也许有更好的办法,但我没有找到。

    推荐文章