Android Textview: “Niet aaneengeert tekst weergegeven met insekst”

Ik stel tekst in met Settext () op de volgende manier.

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

In dat eerst één is eenvoudig gebruik en tweede een tekst met tekst met opmaaktekst.

Android Studio is zoveel interessant, ik heb menu Analyze -> Code Cleanupen ik heb suggestie over twee regels zoals.

CONCATENATE Tekst niet weergegeven met SETEXT. Gebruik resource string
met placeholders. Minder … (CTRL + F1)

Bij het bellen Textview # Settekst:

  • Nooit nummers # tostring () bellen om nummers te formatteren; Het zal geen fractieafscheiders en locale-specifieke cijfers op de juiste manier aan. Overwegen
    Met string # -indeling met juiste formaatspecificaties (% D of% f)
    in plaats daarvan.
  • passeer geen string letterlijke (bijvoorbeeld “hallo”) om tekst weer te geven. Hardcodeerde tekst kan niet correct worden vertaald naar andere talen.
    Overweeg Android Resource-snaren in plaats daarvan te gebruiken.
  • Bouw geen berichten door samen te voegen met tekstbroek. Dergelijke berichten kunnen niet correct worden vertaald.

Wat kan ik hiervoor doen? Iedereen kan helpen verklaren wat het ding is en wat moet ik doen?


1, Autoriteit 100%

Resource heeft de overbelaste versie van getString die een varargsvan het type Objectnodig heeft: getString(int, java.lang.Object…). Als u uw string correct instelt in strings.xml, met de juiste plaatshouders, kunt u deze versie gebruiken om de geformatteerde versie van uw definitieve String op te halen. bijv.

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

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

Android retourneert een String met

"Hello Test! you have 0 new messages"

OversetText("" + name);

Uw eerste voorbeeld, prodNameView.setText("" + name);slaat voor mij nergens op. De TextView kan null-waarden verwerken. Als naam null is, wordt er geen tekst getekend.


Antwoord 2, autoriteit 13%

Verwar niet met %1$sen %2$din het geaccepteerde antwoord. Hier is een paar extra informatie.

  • De formaatspecificaties kunnen de volgende syntaxis hebben:

%[argument_index$]format_specifier

  1. De optionele argument_indexwordt gespecificeerd als een getal dat eindigt met een “$” na de “%” en selecteert het gespecificeerde argument in de argumentenlijst. Naar het eerste argument wordt verwezen door “1$”, naar het tweede door “2$”, enz.
  2. De vereiste opmaakspecificatieis een teken dat aangeeft hoe het argument moet worden opgemaakt. De set geldige conversies voor een bepaald argument hangt af van het gegevenstype van het argument.

Voorbeeld

We zullen de volgende opgemaakte tekenreeks maken waarbij de grijze delen programmatisch worden ingevoegd.

Hallo Test! je hebt 0nieuwe berichten

Uw string resource:

< string name=”welcome_messages”>Hallo, %1$s! Je hebt %2$dnieuw
berichten< /string >

Voer de string substitutionuit zoals hieronder aangegeven:

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

Opmerking:

  • %1$s wordt vervangen door de tekenreeks “Test”
  • %2$d wordt vervangen door de tekenreeks “0”

Antwoord 3, autoriteit 5%

Ik kwam dezelfde pluis-foutmelding tegen en heb het op deze manier opgelost.

Aanvankelijk was mijn code:

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

Ik kreeg de volgende foutmelding

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

Dus ik heb dit toegevoegd aan strings.xml

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

Wat is mijn initiaal “” + een tijdelijke aanduiding voor mijn nummer (aantal).

Opmerking : My quantityVariabele was eerder gedefinieerd en is wat ik aan de tekenreeks wilde toevoegen. Mijn code was als gevolg

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

Hierna ging mijn fout weg. Het gedrag in de app veranderde niet en mijn hoeveelheid bleef weergeven zoals ik het nu wilde zonder een pluisfout.


4, Autoriteit 3%

U moet dit controleren draad en gebruik een tijdelijke aanduiding zoals zijn één (niet getest )

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

5

Het probleem is omdat u ""aan het begin van elke reeks voegt.

LINT ZAL SCAN-argumenten die worden doorgegeven aan setTexten genereert waarschuwingen, in uw geval na waarschuwing is relevant:

Bouw geen berichten door
aaneenbrengende tekstblokken. Dergelijke berichten kunnen niet goed zijn
vertaald.

Zoals u elke reeks aan het samenvoegen bent met "".

Verwijder deze aaneenschakeling terwijl de argumenten die u passeert al tekst. Ook kunt u .toString()gebruiken als u ergens anders nodig bent in plaats van uw string met ""


6

Niet boos, het is te simpel.

String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
            mytextview.setText(result);

7

Als u I18N niet hoeven te ondersteunen, kunt u deze pluizakkiezen uitschakelen in Android Studio

Bestand – & GT; Instellingen – & GT; Editor – & GT; Inspecties – & GT; Android – & GT; Lint – & GT; Textview Internationalisation (Schakel dit uit)


8

U kunt dit gebruiken, het werkt voor mij

title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));

9

prodNameView.setText("" + name); //this produce lint error
val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);

Other episodes