我想在Android中为DataView合并两个字符串,数据绑定Api


91

我正在使用DataBindingApi在android布局中设置视图。这是我的布局。

layout.xml

<?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
  <data>
    <variable name="user" type="testing.sampleapp.com.sampleapp.User"/>
  </data>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{ "Hello " + user.firstName}"/>
</LinearLayout>

我希望TextView显示Hello UserName。如何使用数据绑定API实现此目标。

Answers:


233

将其与重音符号(`)并置

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

您可以通过多种方式进行连接,在此处进行检查concat-two-strings-in-textview-using-databinding


是的,它有效。谢谢 。我使用的是单引号(')。严重的口音为我工作。
Sasank Sunkavalli

@SasankSunkavalli很高兴为您提供帮助:),在使用DataBinding时请务必使用重音符号。
拉维

1
我不明白 在我的.xml上,此方法以及此页面上的任何其他方法甚至都无法发挥作用。它所做的只是打印为:@{Hello`+ user.firstName}`
ekashking

这是数据绑定吗?
IgorGanapolsky

68

@GeorgeMount已在解决方案之一的注释中对此进行了回答。在我看来,到目前为止,这是最好的解决方案。

android:text="@{@string/location(user.city,user.state)}"

在您的strings.xml中

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

大!thnx wery
Serg Burlaka '18

那就是我正在寻找的东西:)
Edgar Khimich

45

连接字符串的多种方法

1.使用字符串资源(由于本地化,因此更可取

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

只是像这样使字符串资源。

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

2.硬编码的连接器

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

3.使用String的concat方法

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

space是放在其中的html实体strings.xml。因为XML不直接接受HTML实体或特殊字符。(链接HTML实体)

<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>

可以有许多其他方法,选择您需要的一种。


选项1对我有用。选项4无效。如果你有一个狭窄的适配器,我建议选择1
rminaj

10

由于xml支持属性值的单引号,因此您也可以这样做:

android:text='@{"Hello "+user.firstName}'

7

有两种方法。

第一个解决方案

带有重音符号的连音(`)

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

第二解决方案

声明你的字符串 strings.xml

喜欢"Hello %1$s , (whatever you want to add then add here)"

使用 String.format(stringResource, upsatename);


我知道这可以解决问题,但是我想使用concat方式
Sasank Sunkavalli

23
您也可以在表达式中使用格式化的字符串资源:android:text="@{@string/hello(user.firstName)}"
George Mount

它是%1 $ s而不是%$ 1s ...;)
Rik van Velzen

6

如果是静态字符串和其他动态字符串,则可以使用此

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

如果是动态数据,则可以使用它。

android:text='@{user.firstName+" "+user.lastName}'

4

要在xml布局中进行合并,请执行以下操作:

<data>

/*This is used for android view*/
<import type="android.view.View" />

/*This is used for android resources*/
<import type="com.myapp.R" />

/*This is app context*/
<variable
    name="context"
    type="android.content.Context" />

/*This is used for model data*/
<variable
    name="item"
    type="com.myapp.models.Chapter" />
</data>

android:text="@{item.serialNo.concat(@string/space).concat(item.title)}"

在strings.xml中,我添加了空白代码:

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

4

如果您想将String资源与模型中的数据合并在一起,可以采用以下方式:

 android:text='@{@string/release_date+model.release_date}'

0

我发现最简单的方法是例如用”(单)代替“”(双)。您有两个变量,

<variable name="a" type="String" />
<variable name="b" type="String" />

现在要串联,

android:text='a + " " + b}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.