gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:47:27 25 4
gpt4 key购买 nike

我正在使用导航图在 fragment 之间导航。一切正常,但我想知道如何以优雅的方式传递参数名称。
这是我来自 navSheet.xml 的代码 fragment :
源 fragment Action :

    <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 :
<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>
我将参数键存储在 string.xml :
<string name="fragment_b_arg_key_name" translatable="false">arg_fragment_b</string>
最后我试图在目标 fragment 中得到我的论点:
    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 key 。它应该是这样的: Bundle[{arg_fragment_b=-730732511}]但我得到: Bundle[{@string/fragment_b_arg_key_name=-730732511}]两个问题:
  • 使用 @string/fragment_b_arg_key_name 有什么问题?在 navSheet.xml 中,因此它不返回 @string/fragment_b_arg_key_name 的内容但原始引用。
  • 如何不对我在 Fragments 中使用的参数名称进行硬编码,navSheet.xml和其他类(class)?如何将这些 key 存储在一个地方?
  • 最佳答案

    What's wrong with using a @string/fragment_b_arg_key_name in navSheet.xml so it not returns the content of @string/fragment_b_arg_key_name but raw reference.


    仅仅是因为 Android Navigation 组件不支持该功能来解析字符串。放在 android:name 中的每个字符串都将成为 bundle 的原始 id。您可以在 https://issuetracker.google.com/issues 中发布此信息
    但是,对此有更好的解决方案。见下文。

    How to not hard-code arguments name that I use in Fragments, navSheet.xml and other classes? How to store such keys in one place?


    使用安全参数
    https://developer.android.com/jetpack/androidx/releases/navigation#safe_args
    您可以更改您的代码如下
    fragment A
    findNavController().navigate(R.id.id_fragment_b, FragmentBArgs(id).toBundle())
    fragment B
    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"/>
    因此,无需存储 key ,因为 safeargs 将为您生成参数,并且默认情况下它是不可为空的。
    要将参数设置为 Nullable,请使用 app:nullable="true"

    关于android - 如何在android导航组件中传递参数名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66457222/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com