web-dev-qa-db-ja.com

データバインディングを使用して、リソースの文字列をXMLの動的変数と結合するにはどうすればよいですか?

ハードコードされた文字列を持つ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は「My Name is」と表示され、その後Profile.nameは動的であり、プロファイルごとに明らかに変化します。 TextViewの出力全体がMy Name is {Profile.name}になるようにします。どんな助けも素晴らしいでしょう。

84
Ignacio Perez

あなたはこれを行うことができます:

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

Generic_Text文字列に文字列フォーマットを使用する場合。例末尾に%s

95
C0D3LIC1OU5

あなたはもっと簡単にこれを行うことができます:

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

247
Roman_D

文字列を連結する多くの方法

1.文字列リソースの使用(Localizationのため推奨)

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は、strings.xml内に配置されるhtmlエンティティです。 XMLはHtmlエンティティまたは特殊文字を直接受け入れないためです。 (Link 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.文字列リソースごとに2つの文字列を連結します。

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

この場合、strings.xmlに文字列リソースを配置します

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

他にも多くの方法がありますが、必要なものを選択してください。

35
Khemraj

2019アップデート、Android studioを3.4、Android Gradleプラグインを3.4

インポートする必要はもうありません

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

文字列操作用。これを確認してください answer

2
SANAT

できないの場合、末尾に%sを含むようにリソース文字列を変更します(たとえば、サフィックスなしで他の場所で使用されるため)。

Android:text="@{@string/Generic_Text.concat(Profile.name)}"

Profile.nameをnullにできない場合は、それで十分です。ただし、nullが発生すると、クラッシュします。別のレイヤーを追加する必要があります。

Android:text="@{@string/Generic_Text.concat(Objects.toString(Profile.name))}"

(これには<import type="Java.util.Objects"/>が必要です。)

繰り返しますが、この余分な作業はすべて、リソース文字列を他の場所で使用している場合にのみ価値があります。 2番目の理由は、nullを「null」リテラルではなく「空の文字列」として処理する場合です。

1
Agent_L