如何在android导航组件传递参数名称?



我使用导航图在片段之间导航。一切正常,但我想知道如何以一种优雅的方式传递参数name。

这是我的代码片段从navSheet.xml:

一个源片段动作:

<action
android:id="@+id/action_go_to_B"
app:destination="@id/id_fragment_b">
<argument
android:name="@string/fragment_b_arg_key_name"
app:argType="integer"/>
</action>

目标片段:

<fragment
android:id="@+id/id_fragment_b"
android:name="pl.asd.FragmentB"
tools:layout="@layout/fragment_b">
<argument
android:name="@string/fragment_b_arg_key_name"
app:argType="integer"/>
</fragment>

我将参数key存储在string.xml中:

<string name="fragment_b_arg_key_name" translatable="false">arg_fragment_b</string>

最后,我尝试在目的地片段中获取参数:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
selectedId = it.getInt(getString(R.string.fragment_b_arg_key_name))
}
}

问题在于android:name="@string/fragment_b_arg_key_name"。我在调试器上看到有一个不正确的bundle键。它应该是这样的:

Bundle[{arg_fragment_b=-730732511}]

但是我得到:

Bundle[{@string/fragment_b_arg_key_name=-730732511}]

两个问题:

  1. 在navSheet.xml中使用@string/fragment_b_arg_key_name有什么问题,所以它不返回@string/fragment_b_arg_key_name的内容,而是原始引用。

  2. 如何不硬编码的参数名称,我使用的片段,navSheet.xml和其他类?如何将这些密钥存储在一个地方?

在navSheet.xml中使用@string/fragment_b_arg_key_name有什么问题,所以它不返回@string/fragment_b_arg_key_name的内容,而是原始引用。

只是因为Android导航组件不支持解析字符串的功能。android:name中的每个字符串都将成为bundle的原始id。您可以在https://issuetracker.google.com/issues

中发出此命令。然而,有更好的解决方案。见下文.

如何不硬编码的参数名称,我在片段,navSheet.xml和其他类使用?如何将这些密钥存储在一个地方?

使用安全参数https://developer.android.com/jetpack/androidx/releases/navigation safe_args

你可以像下面这样修改你的代码

FragmentA

findNavController().navigate(R.id.id_fragment_b, FragmentBArgs(id).toBundle())

FragmentB

private val args : FragmentBArgs by navArgs()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
selectedId = args.arg_fragment_b
}

在navSheet.xml:

<argument
android:name="arg_fragment_b"
app:argType="integer"/>

因此,不需要存储键,因为安全将为您生成参数,并且默认情况下它是非空的。

将参数设置为Nullable,使用app:nullable="true"

相关内容

  • 没有找到相关文章

最新更新