13

我正在学习 Android NavigationUI,并尝试使用 Safe Args 中的字符串默认值设置工具栏标题。但是有一些问题。

“字符串资源”文件:

    <string name="title_add_item">Add new items</string>

导航图文件。将标签设置为Title: {title}参数。

<navigation 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:id="@+id/nav_graph"
app:startDestination="@id/mainFragment">

<fragment
    android:id="@+id/addNewItemFragment"
    android:name="com.myapplication.AddNewItemFragment"
    android:label="Title: {title}"
    tools:layout="@layout/fragment_add_new_item" >
    <argument
        android:name="title"
        app:argType="string"
        android:defaultValue="@string/title_add_item" />
</fragment>
<fragment
    android:id="@+id/mainFragment"
    android:name="com.myapplication.MainFragment"
    android:label="fragment_main"
    tools:layout="@layout/fragment_main" >
    <action
        android:id="@+id/action_to_add_items_fragment"
        app:destination="@id/addNewItemFragment" />
</fragment>

如果{app:argType="string"}我收到错误:

 Caused by: org.xmlpull.v1.XmlPullParserException: unsupported value 'Add new items' for string. You must use a "reference" type to reference other resources.

如果 {app:argType="reference"}应用程序有效,但我在标题中有一个数字(我认为这是一个资源 ID):

在此处输入图像描述

当然,我可以通过从参数中获取它来分配代码中工具栏标题的值。但是是否可以更改此代码以正确填写标题?

4

3 回答 3

1

仅在引用类型中支持对资源的引用。在任何其他类型中使用资源引用都会导致异常。

随意给现有问题加注星标:https ://issuetracker.google.com/issues/167959935 。目前,您可以使用硬编码字符串值app:argType="string"或尝试以编程方式设置,直到它得到解决。

在此处输入图像描述

于 2020-11-14T08:06:10.413 回答
0

看看这里

您不需要使用参数来设置静态标题。您可以使用 将要在工具栏中显示的标题设置为导航图中的片段android:label

<fragment
    android:id="@+id/addNewItemFragment"
    android:name="com.myapplication.AddNewItemFragment"
    android:label="@string/title_add_item"
    tools:layout="@layout/fragment_add_new_item" >

然后使用设置工具栏setupWithNavController

val navController = findNavController(R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration(navController.graph)
findViewById<Toolbar>(R.id.toolbar)
    .setupWithNavController(navController, appBarConfiguration)

这样您就不需要覆盖onSupportNavigateUp,并且一旦您导航到另一个片段,标题将自动更新。

如果由于某种原因您真的想将参数与值结合起来,那么除了在代码中使用和结合两者android:label之外别无他法。app:argType="reference"

于 2020-08-05T17:32:35.163 回答
0

您可以将其设置为参考类型并将其设置为参考/资源getString(args.title)

nav_graph.xml

<fragment
    android:id="@+id/choose_scanner"
    android:name="com.myapp.ChooseScannerFragment"
    tools:layout="@layout/fragment_choose_scanner">
    <action
        android:id="@+id/action_scan_with_camera"
        app:destination="@+id/qr_scanner" />
</fragment>

<fragment
    android:id="@+id/qr_scanner"
    android:name="com.myapp.ScanFragment"
    tools:layout="@layout/fragment_scan">
    <argument
        android:name="show_back_button"
        android:defaultValue="false"
        app:argType="boolean" />

    <argument
        android:name="title"
        android:defaultValue="@string/connect_printer_device"
        app:argType="reference" />

    <argument
        android:name="message"
        android:defaultValue="@string/scan_printer_message"
        app:argType="reference" />
</fragment>

选择ScannerFragment

 findNavController().navigate(ChooseScannerFragmentDirections.actionScanWithCamera(
                    showBackButton = true,
                    title = R.string.step_1_scan_reference,
                    message = R.string.scan_reference_message
                ))

扫描片段.kt

binding.message.text = getString(args.message)
        binding.title.text = getString(args.title)
        binding.back.visibility = if (args.showBackButton) View.VISIBLE else View.INVISIBLE
于 2021-12-23T09:53:47.967 回答