209 votes

Comment puis-je utiliser la liaison de données de combiner une chaîne à partir de ressources avec une variable dynamique en XML?

J'ai un TextView qui a une chaîne codée en dur et j'ai une variable dynamique que je souhaite mettre à la fin de cette chaîne. C'est mon code:

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

Je rencontre un problème avec android:text="@string/Generic_Text"+"@{ Profile.name }" . L' Generic_Text états " Mon Nom est ", puis de l' Profile.name est dynamique et, évidemment, des changements de profil à profil. Je le veux tellement que tout le TextView de sortie est Mon Nom est {Profil.nom}. Toute aide serait super.

434voto

Roman_D Points 2002

Vous pouvez le faire encore plus simple:

android:text= "@{@string/generic_text(profile.name)}"

vous-chaîne doit être comme ceci:

<string name="generic_text">My Name is %s</string>

Edit:

  1. Bien sûr, vous pouvez utiliser autant de variables que vous avez besoin:

    android:text= "@{@string/generic_text(profile.firstName, profile.secondName)}"
    
    <string name="generic_text">My Name is %1$s %2$s</string>
    
  2. Il fonctionne simplement parce qu'il est conçu dans la liaison de données. De plus dans les docs: https://developer.android.com/topic/libraries/data-binding/expressions#resources

237voto

The Metal Beard Points 672

Vous pouvez faire ceci:

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

si vous utilisez la mise en forme de chaîne pour votre Generic_Text chaîne de caractères. ex. %s à la fin

93voto

Khemraj Points 8449

De nombreuses façons de la concaténation de chaînes de caractères

1. L'aide de la chaîne de ressource (Recommandé en raison de la Localisation)

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

Juste faire de la chaîne de ressource de ce genre.

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

2. Codé en dur concat

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

Ceci est utile lorsque vous avez besoin codé en dur ajouter comme + le numéro de téléphone.

3. À l'aide de Strings'méthode concat

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

Ici, space est une entité html, qui est placé à l'intérieur d' strings.xml. Parce qu' XML n'accepte pas les entités Html, ni de caractères spéciaux directement. (Lien En Entités Html)

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

4. À l'aide de String.format()

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

vous devez importer la classe String dans la mise en page de ce type.

<?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. la concaténation de deux chaînes en ressource de chaîne.

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

Dans ce cas, mettez une ressource de chaîne en strings.xml

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

Il peut y avoir de nombreuses autres façons, choisissez celui dont vous avez besoin.

1voto

Agent_L Points 1583

Dans le cas où vous ne pouvez pas changer la chaîne de ressource pour contenir %s à la fin (par exemple. parce qu'il est utilisé ailleurs sans le suffixe):

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

Si Profile.name ne peut pas être nulle, ce qui est assez. Toutefois, si un null arrive, il va se bloquer. Vous devez ajouter une autre couche:

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

(qui exige <import type="java.util.Objects"/> .)

Encore une fois: tout ce travail supplémentaire en vaut la peine seulement si vous avez la chaîne de ressource utilisée ailleurs. La deuxième raison, c'est quand vous voulez gérer l' null "chaîne vide" au lieu de "null" littéral.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X