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.

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


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>

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.


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

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


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

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>

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

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

0

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.