为什么从导航组件版本1.0.0-alpha09中删除addDefaultArguments()?什么是WorkAround将arg从Activity传递给StartDestination? [英] Why addDefaultArguments() removed from Navigation Component version 1.0.0-alpha09? What is WorkAround to pass arg to StartDestination from Activity?
问题描述
您好,我正在研究Navigation Architecture Component和i,并以编程方式为我的Activity设置NavHostFragment.
Hello i am working on Navigation Architecture Component and i and setting up NavHostFragment for my Activity programatically.
MainActivity.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>
MainActiviy.kt :
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
}
}
问题:
我长时间使用了上面的代码,但我将android.arch.navigation:navigation
的gradle依赖版本从1.0.0-alpha08
更新为了1.0.0-alpha09
,并且在下面的代码行中更新后,我遇到了编译时错误:
I am using the above code for a long time but i updated my gradle dependency version of android.arch.navigation:navigation
from 1.0.0-alpha08
to 1.0.0-alpha09
and after update in below line of code i am getting compile time error :
代码:
graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination
错误:
未解决的参考:addDefaultArguments
Unresolved reference: addDefaultArguments
依赖项(项目gradel文件):
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-alpha08
时,一切正常.出于某种原因,谷歌已从
When i revert back to navigation version 1.0.0-alpha08
everything work's fine.For some reason google have removed the addDefaultArguments from NavDestination in alpha09 version.
任何人都知道为什么要删除addDefaultArguments方法吗?
Anyone has idea why addDefaultArguments method is removed?
更新:
什么是将arg从Activity传递给StartDestination的WorkAround?
检查线程以获取有关问题的更多详细信息,基本上我想找到一种方法,可以将参数发送到我的startDestination托管导航片段的活动.
Check the thread for more detail's on question basically i want to find a way to send Argument's to my startDestination from my Activity hosting the Navigation Fragment.
在 1.0.0-alpha09 之前:
只有解决方案我可以找到正在使用addDefaultArguments()
Only Solution can i found is using addDefaultArguments()
在1.0.0-alpha09
之后不知道?
如果有任何解决方法,请共享!
推荐答案
我检查了源代码,发现在导航目标和参数方面有很多更改. 我认为将默认参数传递给导航图的正确方法是这样的:
I checked the source code an saw that there a lot of changes regarding navigation destination and arguments. I think the proper way to pass default arguments to navigation graph is something like this:
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
也许有更好的方法,但是我没有找到一个方法.
Maybe there is a better way, but i didn't found one.
这篇关于为什么从导航组件版本1.0.0-alpha09中删除addDefaultArguments()?什么是WorkAround将arg从Activity传递给StartDestination?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!