Android'de bir TextView için iki dizeyi birleştirmek istiyorum, Veri Bağlama Api


91

DataBindingGörünümleri android düzenlerinde ayarlamak için Api kullanıyorum . İşte düzenim.

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’un Hello UserName öğesini göstermesini istiyorum . Veri bağlama api'sini kullanarak bunu nasıl başarabilirim?

Yanıtlar:


234

ciddi aksanla özetleyin (`)

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

Birden çok şekilde birleştirebilirsiniz, burada concat-two-strings-in-textview-using-databinding


Evet işe yaradı. Teşekkürler . Ters çevrilmiş tek virgül (') kullanıyordum. Mezar aksan (`) benim için çalıştı.
Sasank Sunkavalli

@SasankSunkavalli size yardımcı olmaktan memnuniyet duyar :), DataBinding'i kullanırken her zaman string için ciddi aksan kullanın.
Ravi

1
Ben anlamadım .Xml dosyamda bu yöntem ve bu sayfadaki diğer yöntemler işlevsel olmaya yakın bile değil. Tek yaptığı şu şekilde yazdırmaktır: @{Hello `+ user.firstName}`
ekashking

Bu DataBinding mi?
IgorGanapolsky

68

Bu, çözümlerden birine yapılan yorumlarda @GeorgeMount tarafından zaten yanıtlanmıştır. Bana göre şu ana kadar en iyi çözüm bu.

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

strings.xml dosyanızda

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

harika! thnx wery
Serg Burlaka

aradığım şey bu :)
Edgar Khimich

45

Dizeleri birleştirmenin birçok yolu

1. Dize kaynağını kullanma (Yerelleştirme nedeniyle en çok tercih edilir )

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

Sadece böyle bir dizi kaynağı yapın.

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

2. Sabit kodlu concat

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

3. Stringconcat yöntemini kullanma

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

İşte spaceiçine yerleştirilmiş bir html varlığı strings.xml. Çünkü XMLHtml varlıklarını veya özel karakterleri doğrudan kabul etmez. (Html ​​Varlıklarını Bağla)

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

4. kullanma String.format()

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

String sınıfını bu tipte layout'ta içe aktarmanız gerekir.

<?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. Başka bir yöntem

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

Bu durumda bir string kaynağı koyun strings.xml

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

Başka birçok yol olabilir, ihtiyacınız olan birini seçin.


Seçenek 1 benim için çalıştı. 4. seçenek işe yaramadı. Dar bir adaptörünüz varsa, Seçenek 1'i öneririm.
rminaj

10

Xml, öznitelik değerleri için tek tırnak işaretlerini desteklediğinden, bunu da yapabilirsiniz:

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

7

İki yol var.

İlk Çözüm

aksanlı konkat (`)

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

İkinci Çözüm

Dize ilan et strings.xml

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

amd kullanımı String.format(stringResource, upsatename);


Bunun işe yarayacağını biliyorum, Ama concat yöntemini kullanmak istiyorum
Sasank Sunkavalli

23
İfadede biçimlendirilmiş dize kaynaklarını da kullanabilirsiniz:android:text="@{@string/hello(user.firstName)}"
George Mount

% $ 1s yerine% 1 $ s ...;)
Rik van Velzen

6

Statik dizge ve diğer dinamik durumunda bunu kullanabilirsiniz

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

Dinamik veri olması durumunda bunu kullanabilirsiniz.

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

4

Xml düzeninde bir sonuç yapmak için:

<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'de boşluk için kod ekledim:

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

4

Eğer concat istiyorsanız Stringmodeliniz verilerle kaynak, bu tür bir şekilde yapabilirsiniz:

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

0

Bulduğum en basit yol, "" (çift) yerine '' (tekli) 'yi değiştirmektir. Örneğin. İki değişkeniniz var,

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

Şimdi birleştirmek için,

android:text='a + " " + b}'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.