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.
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?
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é.
Ne vous trompez pas avec % 1 $ s et % 2 $ d dans la réponse acceptée.Voici quelques informations supplémentaires.
% [
argument_index
$]format_specifier
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 avez0
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:
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.
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));
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);
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 ""
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)