Android 数据绑定“??” 符号和来自资源的参数化字符串。如何避免“空”文本?

ale*_*pfx 3 android android-resources android-databinding

我的TextView应用程序中有一些由strings.xml资源文件中的键和动态传递的参数组合而成。我使用 Android Data Binding 其中的 '??' 表示法意味着它应该用空白字符串替换空值,如下例所示。但是当参数值为空直到TextView数据满载时,我们会看到类似“null min”的东西,而我喜欢它是:“min”。

<TextView
    android:id="@+id/text_runtime"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="2dp"
    android:text="@{@string/min(vm.runtime) ?? ``}"
    tools:text="120 min" />
Run Code Online (Sandbox Code Playgroud)

strings.xml

<string name="min">
    <xliff:g id="min">%d</xliff:g>
    min
</string>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 在此处输入图片说明

Geo*_*unt 6

vm.runtime可以为null,但是这可能是一个字符串格式的有效参数,因此它被认为是有效的,??永远不会被评估。

您可以使用的一种表达方式是:

<TextView
    android:id="@+id/text_runtime"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="2dp"
    android:text="@{vm.runtime == null ? `` : @string/min(vm.runtime)}"
    tools:text="120 min" />
Run Code Online (Sandbox Code Playgroud)

如果您希望它具有min而不是空字符串,您可以将字符串格式化两次。

<TextView
    android:id="@+id/text_runtime"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="2dp"
    android:text="@{@string/min(@string/quantity(vm.runtime) ?? ``)}"
    tools:text="120 min" />
Run Code Online (Sandbox Code Playgroud)

你的 min 定义如下:

<string name="min">
    <xliff:g id="min">%s</xliff:g>
    min
</string>
Run Code Online (Sandbox Code Playgroud)

数量字符串很简单:

<string name="quantity">%d</string>
Run Code Online (Sandbox Code Playgroud)

我认为这应该在所有语言中都正确格式化,但如果您打算本地化,我建议您使用复数而不是字符串来表示 min。