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.
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?
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é.
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
- 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.
- 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 avez0
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"
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.
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);
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 ""
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));