如何使用数据绑定将资源中的字符串与XML中的动态变量组合?

Ign*_*rez 102 android android-databinding

我有一个TextView,它有一个硬编码的字符串,我有一个动态变量,我想放在这个字符串的末尾.这是我的代码:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp">
    <TextView
        android:id="@+id/PeopleName"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/Generic_Text"+"@{ Profile.name }" />


</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我遇到了问题 android:text="@string/Generic_Text"+"@{ Profile.name }".该Generic_Text州"我的名字是",则Profile.name是动态的,并从轮廓明显的变化来分析.我想要它,以便整个TextView输出是我的名字是{Profile.name}.任何帮助都会很棒.

Rom*_*n_D 285

你甚至可以更简单地做到这一点:

android:text= "@{@string/generic_text(profile.name)}"
Run Code Online (Sandbox Code Playgroud)

你的字符串应该是这样的:

<string name="generic_text">My Name is %s</string>
Run Code Online (Sandbox Code Playgroud)

编辑:

  1. 当然,您可以根据需要使用尽可能多的变量:

    android:text= "@{@string/generic_text(profile.firstName, profile.secondName)}"
    
    <string name="generic_text">My Name is %1$s %2$s</string>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 它的工作原理只是因为它是在数据绑定中设计的.更多文档:https://developer.android.com/topic/libraries/data-binding/expressions#resources

  • 在这种情况下,只需先检查一下即可。`android:text= "@{profile == null ? @string/loading : @string/generic_text(profile.firstName, profile.secondName)}"` (3认同)
  • 最佳答案:) (2认同)

C0D*_*OU5 113

你可以这样做:

android:text= "@{String.format(@string/Generic_Text, Profile.name)}"
Run Code Online (Sandbox Code Playgroud)

如果您为Generic_Text字符串使用字符串格式.恩.%s在末尾

  • 这不应该是公认的答案,因为它实际上并不使用数据绑定功能来操纵文本。 (3认同)

Khe*_*raj 43

连接字符串的方法很多

1.使用字符串资源(推荐因为本地化)

android:text= "@{@string/generic_name(user.name)}"

只需像这样制作字符串资源.

<string name="generic_name">Hello %s</string>
Run Code Online (Sandbox Code Playgroud)

2.硬编码concat

android:text="@{`Hello ` + user.name}"/>
Run Code Online (Sandbox Code Playgroud)

当您需要像电话号码这样的硬编码追加时,这非常有用.

3.使用Stringconcat方法

android:text="@{user.firstName.concat(@string/space).concat(user.lastName)}"
Run Code Online (Sandbox Code Playgroud)

space是一个放在里面的html实体strings.xml.因为XML不直接接受Html实体或特殊字符.(链接Html实体)

<string name="space">\u0020</string>
Run Code Online (Sandbox Code Playgroud)

4.使用 String.format()

android:text= "@{String.format(@string/Hello, user.name)}"
Run Code Online (Sandbox Code Playgroud)

您必须在此类型的布局中导入String类.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <import type="String" />
    </data>
    <TextView
        android:text= "@{String.format(@string/Hello, user.name)}"
        ... >
    </TextView>
</layout>
Run Code Online (Sandbox Code Playgroud)

5.通过字符串资源连接两个字符串.

android:text="@{@string/generic_name(user.firstName,user.lastName)}"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,放入一个字符串资源 strings.xml

<string name="generic_name">%1$s, %2$s</string>
Run Code Online (Sandbox Code Playgroud)

可以有许多其他方式,选择你需要的方式.


小智 12

字符串.xml:<string name="my_string">Hello %s</string>

视图.xml:android:text="@{@string/my_string(name)}"


SAN*_*NAT 7

2019 更新,Android studio 到 3.4,Android Gradle 插件到 3.4

不再需要导入

<import type="java.lang.String" />" 
Run Code Online (Sandbox Code Playgroud)

用于字符串操作。请检查这个答案


小智 7

如果您想在 XML 中输入文本,可以使用``引号。

android:text="@{`Device Name`}"
Run Code Online (Sandbox Code Playgroud)

在其他地方你需要与字符串或变量连接,你可以使用

android:text="@{`Device Name`.concat(android.os.Build.MANUFACTURER)}"
Run Code Online (Sandbox Code Playgroud)

如果你想连接字符串资源而不是变量,你可以这样做,

android:text="@{@string/app_name.concat(`Device Name`)}"
Run Code Online (Sandbox Code Playgroud)


jua*_*gui 6

使用绑定适配器

此示例是用 Kotlin 编写的,并考虑到绑定变量可以为 null:

@BindingAdapter("my_name")
fun TextView.setMyName(name: String?) {
    this.text =
        if (name.isNullOrEmpty()) "" else "${this.context.getString(R.string.Generic_Text)} $name"
}
Run Code Online (Sandbox Code Playgroud)

然后在您的 XML 中使用绑定适配器而不是android:text属性

app:my_name="@{Profile.name}"
Run Code Online (Sandbox Code Playgroud)


ogu*_*han 5

您还可以使用格式化程序将字符串资源设置为其他字符串资源的参数,如下所示:

<string name="first_param_text">Hello</string>
<string name="second_param_text">World</string>
<string name="formatted_text">%s lovely %s</string>
Run Code Online (Sandbox Code Playgroud)

android:text="@{String.format(@string/formatted_text, @string/first_param_text, @string/second_param_text)}"
Run Code Online (Sandbox Code Playgroud)

“你好可爱的世界”将出现在视图中。