ハードコードされた文字列を持つ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}になるようにします。どんな助けも素晴らしいでしょう。
あなたはこれを行うことができます:
Android:text= "@{String.format(@string/Generic_Text, Profile.name)}"
Generic_Text
文字列に文字列フォーマットを使用する場合。例末尾に%s
あなたはもっと簡単にこれを行うことができます:
Android:text= "@{@string/generic_text(profile.name)}"
文字列は次のようになります。
<string name="generic_text">My Name is %s</string>
編集:
もちろん、必要な数の変数を使用できます。
Android:text= "@{@string/generic_text(profile.firstName, profile.secondName)}"
<string name="generic_text">My Name is %1$s %2$s</string>
データバインディングで設計されているからこそ機能します。ドキュメントの詳細: https://developer.Android.com/topic/libraries/data-binding/expressions#resources
Android:text= "@{@string/generic_name(user.name)}"
このような文字列リソースを作成します。
<string name="generic_name">Hello %s</string>
Android:text="@{`Hello ` + user.name}"/>
これは、電話番号に+のようなハードコードされた追加が必要な場合に便利です。
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>
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>
Android:text="@{@string/generic_name(user.firstName,user.lastName)}"
この場合、strings.xml
に文字列リソースを配置します
<string name="generic_name">%1$s, %2$s</string>
他にも多くの方法がありますが、必要なものを選択してください。
2019アップデート、Android studioを3.4、Android Gradleプラグインを3.4
インポートする必要はもうありません
<import type="Java.lang.String" />"
文字列操作用。これを確認してください answer 。
できないの場合、末尾に%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」リテラルではなく「空の文字列」として処理する場合です。