Android TextView: "ne concaténez pas le texte affiché avec setText"

je règle le texte en utilisant setText () de la façon 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 que premier un est une utilisation simple et Second un est la mise en forme du texte avec le texte de formatage.

Android Studio est tellement intéressant, j'ai utilisé le Menu Analyze -> Code Cleanup et j'ai eu des suggestions au-dessus de deux lignes comme.

enter image description here

ne concaténate pas le texte affiché avec setText. Utiliser la chaîne de ressources avec des espaces réservés. peu... (Ctrl+F1)

lors de l'appel TextView#setText:

  • ne Jamais appeler le Numéro toString() pour formater les nombres; il ne le sera pas pour la fraction des séparateurs et des spécificités locales en chiffres correctement. Considérer utiliser le format#String avec le format approprié spécifications (%d ou %f) plutôt.
  • ne pas passer une chaîne de caractères littérale (par exemple" Hello") pour afficher le texte. Les textes codés ne peuvent pas être traduits correctement dans d'autres langues. Envisagez plutôt D'utiliser les chaînes de ressources Android.
  • ne construisez pas de messages en concaténant des morceaux de texte. De tels messages ne peuvent pas être traduits correctement.

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

81
demandé sur Pratik Butani 2015-10-16 10:32:45

6 réponses

ressource a la version get overloaded de getString qui prend un varargs de type Object : getString(int, java.lang.Objet...) . Si vous configurez correctement votre chaîne dans strings.xml, avec les bons titulaires de place, vous pouvez utiliser cette version pour récupérer la version formatée de votre chaîne finale. Par exemple:

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

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

android retournera une chaîne de caractères 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 les valeurs nulles. Si nom est nul, aucun texte ne sera tiré.

204
répondu Blackbelt 2015-10-16 08:00:53

Ne pas se confondre avec %1$s et %2$d dans l'acceptation de réponse.Voici quelques informations supplémentaires.

  • les spécificateurs de format peuvent être de la syntaxe suivante:

%[ argument_index $] format_specifier

  1. l'option argument_index est un nombre se terminant par un "$" après le "%" et sélectionne l'argument spécifié dans la liste d'arguments. Le premier argument est référencé par "1$" , le second par "2$" , etc.
  2. Le nécessaire spécificateur de format 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 où les parties grises sont insérées programmatiquement.

Bonjour Test ! vous avez 0 nouveaux messages

Votre string resource :

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

Faire de la string substitution , comme indiqué ci-dessous:

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

Note:

  • %1$s substitude par la chaîne "Test
  • %2$d substitude par la chaîne "0"
10
répondu Rissmon Suresh 2017-11-19 17:53:09

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

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

qui est mon initiale "" + un paramètre pour mon nombre(quantité).

Note : ma variable quantity a été définie précédemment et est ce que je voulais ajouter à la chaîne. Mon code en conséquence é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 a disparu. Le comportement de l'application n'a pas changé et ma quantité continué à afficher comme je le voulais maintenant, sans peluches erreur.

10
répondu user1580203 2018-01-22 10:34:02

vous devez cocher cette case thread et utiliser un paramètre comme 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);
6
répondu ThomasThiebaud 2017-05-23 11:33:26

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

lint numérisera les arguments passés à setText et générera des avertissements, dans votre cas l'avertissement suivant est pertinent:

ne construisez pas de messages par des morceaux de texte concaténés. De tels messages ne peuvent pas être correctement traduire.

comme vous concaténez chaque chaîne avec "" .

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

2
répondu Rahul Tiwari 2015-10-16 08:02:00

ne concaténez pas le texte à l'intérieur de votre méthode setText () , concaténez ce que vous voulez dans une String et mettez cette valeur de chaîne dans votre méthode setText () .

ex: le bon chemin

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));
0
répondu Ashana.Jackol 2018-07-10 05:39:58