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

时间:2016-08-16 15:10:48

标签: 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>

我遇到了android:text="@string/Generic_Text"+"@{ Profile.name }"的问题。 Generic_Text个州&#34;我的名字是&#34;然后Profile.name是动态的,显然会从配置文件更改为配置文件。我想要它,以便整个TextView输出我的名字是{Profile.name} 。任何帮助都会很棒。

11 个答案:

答案 0 :(得分:240)

你可以做得更简单:

android:text= "@{@string/generic_text(profile.name)}"

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

<string name="generic_text">My Name is %s</string>

编辑:

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

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

答案 1 :(得分:89)

你可以这样做:

android:text= "@{String.format(@string/Generic_Text, Profile.name)}"

如果您对Generic_Text字符串使用字符串格式。恩。最后%s

答案 2 :(得分:34)

许多连接字符串的方法

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

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

只需创建这样的字符串资源。

<string name="generic_name">Hello %s</string>

2。硬编码的concat

android:text="@{`Hello ` + user.name}"/>

当您需要像+这样的硬编码附加电话号码时,这很有用。

3。使用String的concat方法

android:text="@{user.firstName.concat(@string/space).concat(user.lastName)}"

此处space是放置在strings.xml内的html实体。因为XML不直接接受HTML实体或特殊字符。 (Link Html Entities)

<string name="space">\u0020</string>

4。使用String.format()

android:text= "@{String.format(@string/Hello, user.name)}"

您必须以这种类型在布局中导入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>

5。按字符串资源连接两个字符串。

android:text="@{@string/generic_name(user.firstName,user.lastName)}"

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

<string name="generic_name">%1$s, %2$s</string>

还有很多其他方法,可以选择所需的一种。

答案 3 :(得分:2)

2019更新,Android Studio升级到3.4,Android Gradle插件升级到3.4

不再需要导入

<import type="java.lang.String" />" 

用于字符串操作。请检查此answer

答案 4 :(得分:1)

如果您不能将资源字符串更改为在末尾包含SELECT sAMAccountName, name, mail AS email FROM OPENQUERY(ADSI, 'SELECT sAMAccountName, name, mail FROM ''LDAP://myServer/OU=myOU,DC=myDC1,DC=myDC2'' WHERE objectCategory=''person'' AND objectClass = ''user'' ' ) (例如,因为它在没有后缀的其他地方使用):

%s

如果android:text="@{@string/Generic_Text.concat(Profile.name)}" 不能为null,那就足够了。但是,如果发生Profile.name,它将崩溃。您必须添加另一层:

null

(这需要android:text="@{@string/Generic_Text.concat(Objects.toString(Profile.name))}" 才能起作用。)

再次:仅当您在其他地方使用了资源字符串时,所有这些额外的工作才是值得的。第二个原因是您想将<import type="java.util.Objects"/>当作“空字符串”而不是“空”文字处理。

答案 5 :(得分:1)

您还可以使用如下格式器将字符串资源设置为其他字符串资源的参数:

<string name="first_param_text">Hello</string>
<string name="second_param_text">World</string>
<string name="formatted_text">%s lovely %s</string>

android:text="@{String.format(@string/formatted_text, @string/first_param_text, @string/second_param_text)}"

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

答案 6 :(得分:0)

使用Binding Adapter

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

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

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

app:my_name="@{Profile.name}"

答案 7 :(得分:0)

如果要在XML中键入文本,可以使用``引号。

android:text="@{`Device Name`}"

在其他需要与字符串或变量保持一致的地方,可以使用

android:text="@{`Device Name`.concat(android.os.Build.MANUFACTURER)}"

如果您想连接字符串资源而不是可以执行的变量

android:text="@{@string/app_name.concat(`Device Name`)}"

答案 8 :(得分:0)

只需放置或附加您的字符串资源名称即可正常工作

e.x @string/test

android:text="@{@string/test+viewModel.name+@string/test}"

答案 9 :(得分:0)

strings.xml:<string name="my_string">Hello %s</string>

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

答案 10 :(得分:-1)

仅使用+运算符对我有用:

android:text= "@{@string/Generic_Text +' '+ Profile.name)}"

String.xml将是:

<string name="Generic_Text">Hello</string>