我有一个有NavHostFragment
的活动。活动在其意图中接收某些值。我想将这些数据传递给第一个片段,即导航图的startDestination
。我找不到任何关于此的文件。
我已经通过this question on SO,但我似乎无法找到addDefaultArguments
的navController.getGraph()
方法。
是否有可能将捆绑传递给startDestination
?
我也遇到过同样的问题,
这就是我如何解决它:
your_activity.xml
中删除NavHostFragment的xml设置:即删除app:navGraph =“@ navigation / nav_graph这就是你的XML应该是这样的。
<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"
/>
onCreate()
of activity中以编程方式添加NavHostFragment的设置。并使用NavGraph.addDefaultArguments(bundleData)
api传递包数据
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.editor_layout)
setupNavigation()
}
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
}
更新:
我的Project Gradle文件中的依赖项:
dependencies {
def nav_version = "1.0.0-alpha08"
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-alpha09
由于某种原因谷歌没有方法,因为addDefaultArguments()
可能很快就会修复。但是较低版本有addDefaultArguments()
方法。我已经检查了java和kotlin,所以尝试使用1.0.0-alpha07
或1.0.0-alpha08
您可以像这样在图表中添加参数
<fragment
android:id="@+id/exampleFragment"
android:label="example_fragment"
android:name="com.example.yourapp.ui.ExampleFragment"
tools:layout="@layout/example_fragment">
<argument
android:name="exampleArgs"
app:argType="reference"
android:defaultValue="@string/example"/>
</fragment>
https://developer.android.com/guide/navigation/navigation-pass-data
我找不到这种方法。它在架构组件文档中不存在。
但这是设置起始目标的参数的另一种方法:
// Kotlin Code, in Fragment
with(findNavController().graph) {
get(startDestination).addArgument(...)
}
我检查了源代码,看到有关导航目标和参数的很多变化。我认为将参数传递给起始目的地的正确方法是使用'addArgument'方法,如下所示:
val argument1 = 1 //First value
val argument2 = "Value" //Second value
val navArgument1=NavArgument.Builder().setDefaultValue(argument1).build()
val navArgument2=NavArgument.Builder().setDefaultValue(argument2).build()
navController.getGraph().addArgument("Key1",navArgument1)
navController.getGraph().addArgument("Key2",navArgument2)
也许有更好的方法,但我没有找到一个。
class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navHostFragment = container as NavHostFragment
val inflater = navHostFragment.navController.navInflater
val graph = inflater.inflate(R.navigation.main_nav)
var data : Data = intent.getParcelableExtra("DATA") as Data
var bundle : Bundle = Bundle()
bundle.putParcelable("DATA", data)
graph.addDefaultArguments(bundle)
graph.addDefaultArguments(intent!!.extras!!)
navHostFragment.navController.graph = graph
}
}
在Activity中添加上述代码,使用导航发送数据
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
var data = NavHostFragment.findNavController(this).graph.defaultArguments.getParcelable("DATA") as Booking
}
在片段方面添加上面的代码
导航1.0.0
val navHostFragment = root_nav_host_fragment as NavHostFragment
val navController = navHostFragment.navController
val navInflater = navController.navInflater
val graph = navInflater.inflate(R.navigation.navigation)
val sectionId = intent.getIntExtra(KEY_SECTION_ID, -1)
val bundle = bundleOf(KEY_SECTION_ID to sectionId)
navHostFragment.navController.setGraph(graph, bundle)
回答我自己的问题,因为我在更新的导航文档中找到了正确的方法。
在写这个答案的时候,我正在使用Navigation 2.2.0-alpha01
如果要将某些数据直接作为来自主机活动的参数传递到起始目标,则需要在主机活动的onCreate()方法中手动设置主机的导航图,如下所示:
给你navController:
val navController by lazy { findNavController(R.id.<your_nav_host_id>) }
然后在主持人活动的onCreate()
val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation.<you_nav_graph_xml>, bundle)
或者如果你想将整个意图附加内容传递给startDestination:
navController.setGraph(R.navigation.<you_nav_graph_xml>, intent.extras)
因为intent.extras
只返回Bundle
使用setGraph()方法设置navGraph时,应避免在NavHostFragment定义中设置app:NavGraph属性,因为这样做会导致两次导航图膨胀和设置。
在startDestination片段中读取这些参数时:
如果您使用的是Safe Args Plugin(非常推荐),那么在您的片段中:
private val args by navArgs<DummyFragmentArgs>()
Safe Args插件会通过将Args附加到您的片段名称来生成Args类。例如,如果你的片段被称为DummyFragment
,那么Safe Args将生成一个名为DummyFragmentArgs
的类
其中navArgs<>
是Android KTX中定义的扩展函数
如果您没有使用Android KTX,您可以获取args对象,如:
val args = DummyFragmentArgs.fromBundle(arguments!!)
一旦获得了arguments对象,就可以简单地获取你的参数:
args.someArgument
注意我们如何通过qazxswpoi作为参数,我们正在使用Safe Args将其作为"some_argument"
读取
如果您没有使用Safe Args(没有理由不使用它),您可以像这样访问您的参数:
someArgument
所有这些都记录在迁移到导航组件文档中:arguments?.getString("some_argument")