Ich möchte zwei Zeichenfolgen für eine TextView in Android, Data Binding Api, zusammenfassen

92

Ich benutze DataBindingApi zum Einstellen der Ansichten in Android-Layouts. Hier ist mein Layout.

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>

Ich möchte, dass in der Textansicht Hello UserName angezeigt wird . Wie dies mit der Datenbindungs-API erreicht werden kann.

Sasank Sunkavalli
quelle

Antworten:

236

verkette es mit ernstem Akzent (`)

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

Sie können es auf verschiedene Arten verknüpfen. Überprüfen Sie es hier. Konzentrieren Sie sich auf zwei Zeichenfolgen in der Textansicht mithilfe der Datenbindung

Ravi
quelle
Ja, es hat funktioniert. Vielen Dank . Ich habe ein einzelnes Anführungszeichen (') verwendet. Schwerer Akzent (`) hat bei mir funktioniert.
Sasank Sunkavalli
@ SasankSunkavalli hilft Ihnen gerne :) Verwenden Sie bei der Verwendung von DataBinding immer einen starken Akzent für Zeichenfolgen.
Ravi
1
Ich verstehe es nicht In meiner XML-Datei ist diese Methode sowie alle anderen Methoden auf dieser Seite nicht annähernd funktionsfähig. Alles, was es tut, wird gedruckt als: @{Hallo `+ user.firstName}`
ekashking
Dies ist DataBinding?
IgorGanapolsky
69

Dies wird bereits von @GeorgeMount in Kommentaren zu einer der Lösungen beantwortet. Was für mich hier die bisher beste Lösung ist.

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

in Ihrer strings.xml

<string name="location">%1$s, %2$s</string>
Prakash
quelle
großartig! Danke wery
Serg Burlaka
das ist was ich suche :)
Edgar Khimich
47

Viele Möglichkeiten, um Saiten zu konzentrieren

1. Verwenden einer Zeichenfolgenressource ( aufgrund der Lokalisierung am meisten bevorzugt )

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

Machen Sie einfach eine String-Ressource wie diese.

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

2. Hartcodierter Concat

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

3. Verwenden Sie Stringdie Concat-Methode

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

Hier spaceist eine HTML-Entität, die darin platziert wird strings.xml. Weil XMLkeine HTML-Entitäten oder Sonderzeichen direkt akzeptiert. (Link HTML Entities)

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

4. Verwenden von String.format()

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

Sie müssen die String-Klasse im Layout dieses Typs importieren.

<?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. Eine andere Methode

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

In diesem Fall fügen Sie eine Zeichenfolgenressource ein strings.xml

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

Es gibt viele andere Möglichkeiten, wählen Sie eine, die Sie benötigen.

Khemraj
quelle
Option 1 hat bei mir funktioniert. Option 4 hat nicht funktioniert. Wenn Sie einen schmalen Adapter haben, empfehle ich Option 1.
rminaj
10

Da XML einfache Anführungszeichen für Attributwerte unterstützt, können Sie dies auch tun:

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

Es gibt zwei Möglichkeiten.

Erste Lösung

concat mit ernstem Akzent (`)

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

Zweite Lösung

Deklarieren Sie Ihre Zeichenfolge in strings.xml

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

und verwenden String.format(stringResource, upsatename);

Yogesh Rathi
quelle
Ich weiß, dass dies funktionieren würde, aber ich möchte den Concat-Weg verwenden
Sasank Sunkavalli
23
Sie können auch formatierte Zeichenfolgenressourcen im Ausdruck verwenden:android:text="@{@string/hello(user.firstName)}"
George Mount
es ist% 1 $ s statt% $ 1s ...;)
Rik van Velzen
6

Bei statischen Zeichenfolgen und anderen dynamischen Zeichenfolgen können Sie diese verwenden

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

Bei dynamischen Daten können Sie diese verwenden.

android:text='@{user.firstName+" "+user.lastName}'
Kishan Verma
quelle
4

So erstellen Sie ein Concat im XML-Layout:

<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)}"

In strings.xml habe ich Code für Leerzeichen hinzugefügt:

<string name="space">\u0020</string>
Bereit für Android
quelle
4

Wenn Sie StringRessourcen mit Daten aus Ihrem Modell verknüpfen möchten , können Sie dies folgendermaßen tun:

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

Der einfachste Weg, den ich gefunden habe, besteht darin, '' (einfach) anstelle von "" (doppelt) zu ersetzen, z. Sie haben zwei Variablen,

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

Nun zu verketten,

android:text='a + " " + b}'
Aziz
quelle
0

Wahrscheinlich zu spät zur Party: Der folgende Code wird auch funktionieren

android:text='@{@string/hello.concat(user.firstName)}'

Madroid
quelle