web-dev-qa-db-fra.com

Android TextView: "Ne pas concaténer le texte affiché avec setText"

Je configure le texte en utilisant setText () de la manière suivante.

_prodNameView.setText("" + name);

prodOriginalPriceView.setText("" + String.format(getString(R.string.string_product_rate_with_ruppe_sign), "" + new BigDecimal(price).setScale(2, RoundingMode.UP)));
_

Dans ce , le premier est un usage simple et le second , vous définissez du texte avec mise en forme du texte.

Android Studio est tellement intéressant que j'ai utilisé Menu Analyze -> Code Cleanup et j’ai eu une suggestion sur les deux lignes ci-dessus, comme.

enter image description here

Ne concaténez pas le texte affiché avec setText. Utiliser une chaîne de ressources avec des espaces réservés. moins ... (Ctrl + F1)

Lorsque vous appelez TextView # setText:

  • N'appelez jamais le numéro # toString () pour formater les numéros; il ne gérera pas correctement les séparateurs de fraction et les chiffres spécifiques aux paramètres régionaux. Utilisez plutôt le format String # avec les spécifications de format appropriées (% d ou% f).
  • Ne transmettez pas de littéral de chaîne (par exemple, "Bonjour") pour afficher du texte. Le texte codé en dur ne peut pas être traduit correctement dans d'autres langues. Pensez plutôt à utiliser Android chaînes de ressources.
  • Ne créez pas de messages en concaténant des fragments de texte. De tels messages ne peuvent pas être traduits correctement.

Qu'est-ce que je peux faire pour ça? N'importe qui peut aider à expliquer ce qu'est la chose et que dois-je faire?

117

Resource possède la version get surchargée de getString qui prend un varargs de type Object: getString (int, Java.lang.Object ...) . Si vous configurez correctement votre chaîne dans strings.xml, avec les espaces réservés appropriés, vous pouvez utiliser cette version pour récupérer la version mise en forme de votre chaîne finale. Par exemple.

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

en utilisant getString(R.string.welcome_message, "Test", 0);

Android retournera une chaîne avec

 Hello Test! you have 0 new messages

À propos de setText("" + name);

Votre premier exemple, prodNameView.setText("" + name);, n’a aucun sens pour moi. TextView est capable de gérer des valeurs NULL. Si name est null, aucun texte ne sera dessiné.

250
Blackbelt

Ne vous trompez pas avec % 1 $ s et % 2 $ d dans la réponse acceptée.Voici quelques informations supplémentaires.

  • Les spécificateurs de format peuvent avoir la syntaxe suivante:

% [argument_index $] format_specifier

  1. L'argument optionnel argument_index est spécifié sous la forme d'un nombre se terminant par un "$" après le "%" et sélectionne l'argument spécifié dans la liste des arguments. Le premier argument est référencé par "1 $" , le second par "2 $" , etc.
  2. Le spécificateur de format requis est un caractère indiquant comment l'argument doit être formaté. L'ensemble des conversions valides pour un argument donné dépend du type de données de l'argument .

Exemple

Nous allons créer la chaîne formatée suivante dans laquelle les parties grises sont insérées par programme.

Bonjour Test! vous avez 0 nouveaux messages

Votre string resource:

<string name = "welcome_messages"> Bonjour, %1$s! Vous avez %2$d nouveaux messages </ string>

Faites le string substitution comme indiqué ci-dessous:

getString (R.string.welcome_message, "Test", 0);

Remarque:

  • % 1 $ s sera substitué par la chaîne "Test"
  • % 2 $ d sera substitué par la chaîne "0"
23
Rissmon Suresh

J'ai rencontré le même message d'erreur de charpie et l'ai résolu de cette façon.

Au départ, mon code était:

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText("" + quantity);
}

J'ai eu l'erreur suivante

Do not concatenate text displayed with setText. Use resource string with placeholders.

Donc, j'ai ajouté ceci à strings.xml

<string name="blank">%d</string>

Quel est mon "" initial + un espace réservé pour mon numéro (quantité).

Note: Ma variable quantity a déjà été définie et est ce que je voulais ajouter à la chaîne. Mon code à la suite était

private void displayQuantity(int quantity) {
    TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
    quantityTextView.setText(getString(R.string.blank, quantity));
}

Après cela, mon erreur est partie. Le comportement dans l'application n'a pas changé et ma quantité a continué à s'afficher comme je le voulais maintenant sans erreur de peluches.

13
user1580203

Ne concaténez pas de texte dans votre méthode setText (), concaténez ce que vous voulez dans un String et placez cette valeur String dans votre setText () méthode.

ex: manière correcte

int min = 120;
int sec = 200;
int hrs = 2;

String minutes = String.format("%02d", mins);
            String seconds = String.format("%02d", secs);
            String newTime = hrs+":"+minutes+":"+seconds;

text.setText(minutes);

Ne pas concaténer à l'intérieur de setText () comme

text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));
9
Ashana.Jackol

Vous devriez vérifier ceci thread et utiliser un espace réservé tel que le sien (non testé)

<string name="string_product_rate_with_ruppe_sign">Price : %1$d</string>

String text = String.format(getString(R.string.string_product_rate_with_ruppe_sign),new BigDecimal(price).setScale(2, RoundingMode.UP));
prodOriginalPriceView.setText(text);
8
ThomasThiebaud

le problème vient du fait que vous ajoutez "" au début de chaque chaîne.

lint analysera les arguments passés à setText et générera des avertissements. Dans votre cas, les avertissements suivants sont pertinents:

Ne créez pas de messages en concaténant des fragments de texte. De tels messages ne peuvent pas être traduits correctement.

en concaténant chaque chaîne avec "".

supprimez cette concaténation car les arguments que vous transmettez sont déjà du texte. De plus, vous pouvez utiliser .toString() si vous en avez besoin ailleurs au lieu de concaténer votre chaîne avec ""

4
Rahul Tiwari

Si vous n'avez pas besoin de prendre en charge i18n, vous pouvez désactiver cette vérification des peluches dans Android Studio.

Fichier -> Paramètres -> Éditeur -> Inspections -> Android -> Lint -> Internationalisation TextView (décochez cette case)

1
ssynhtn