Ustawiam tekst za pomocą setText () w następujący sposób.
prodNameView.setText("" + name);
prodOriginalPriceView.setText("" + String.format(getString(R.string.string_product_rate_with_ruppe_sign), "" + new BigDecimal(price).setScale(2, RoundingMode.UP)));
W tym pierwszym jest proste użycie, a drugim jest ustawienie tekstu z formatowaniem tekstu.
Android Studio jest tak bardzo interesujące, że skorzystałem z Menu Analyze -> Code Cleanup
i otrzymałem sugestię w dwóch powyższych liniach, takich jak.
Nie łącz tekstu wyświetlanego z setText. Użyj ciągu zasobów z symbolami zastępczymi. mniej ... (Ctrl + F1)
Podczas wywoływania TextView # setText:
- Nigdy nie wywołuj Number # toString () w celu sformatowania liczb; nie będzie poprawnie obsługiwał separatorów ułamków i cyfr specyficznych dla ustawień regionalnych. Zamiast tego rozważ użycie formatu String # z odpowiednimi specyfikacjami formatu (% d lub% f).
- Nie przekazuj literału ciągu (np. „Hello”), aby wyświetlić tekst. Tekst zakodowany na stałe nie może być poprawnie przetłumaczony na inne języki. Zamiast tego rozważ użycie ciągów zasobów systemu Android.
- Nie twórz wiadomości przez łączenie fragmentów tekstu. Takie wiadomości nie mogą być poprawnie przetłumaczone.
Co mogę z tym zrobić? Każdy może pomóc wyjaśnić, co to jest i co mam zrobić?
android
concatenation
textview
string-concatenation
Pratik Butani
źródło
źródło
String
dosetText()
. Np .:setText(name)
zamiastsetText("" + name)
. Ponieważ jeśli połączysz tekst, nie zostanie on przetłumaczony tak, jak używasz tekstu zakodowanego na sztywno, o czym informuje wiadomośćNPE
jeśliname
takNULL
name
nie jestNULL
przed użyciemsetText()
funkcji.<string name="string_product_rate_with_ruppe_sign">Something %1$d</string>
A w swoim kodzie java robisz coś takiego:prodOriginalPriceView.setText(getString(R.string.string_product_rate_with_ruppe_sign), price);
(możesz formatować w pliku xml: [ developer.android.com/guide/topics/resources/ ...Odpowiedzi:
Zasób ma przeciążoną wersję getString, która przyjmuje plik
varargs
typObject
: getString (int, java.lang.Object ...) . Jeśli poprawnie skonfigurujesz swój ciąg w strings.xml, z odpowiednimi symbolami zastępczymi, możesz użyć tej wersji do pobrania sformatowanej wersji ostatecznego ciągu. Na przykład<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
za pomocą
getString(R.string.welcome_message, "Test", 0);
android zwróci String z
"Hello Test! you have 0 new messages"
O
setText("" + name);
Twój pierwszy przykład
prodNameView.setText("" + name);
nie ma dla mnie żadnego sensu. TextView jest w stanie obsłużyć wartości null. Jeśli nazwa ma wartość null, tekst nie zostanie narysowany.źródło
%1$f
do swojego ciągu, w strings.xml, a następnie zadzwońsetText(getString(R.string.string_product_rate_with_ruppe_sign, new BigDecimal(price).setScale(2, RoundingMode.UP).floatValue() ));
%1$d
. @ reegan29Nie daj się pomylić z % 1 $ s i % 2 $ d w zaakceptowanej odpowiedzi. Oto kilka dodatkowych informacji.
Przykład
Utworzymy następujący sformatowany ciąg, w którym szare części zostaną wstawione programowo.
Twój
string resource
:Wykonaj
string substitution
poniższe czynności:Uwaga:
źródło
Natrafiłem na ten sam komunikat o błędzie kłaczków i rozwiązałem go w ten sposób.
Początkowo mój kod brzmiał:
private void displayQuantity(int quantity) { TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view); quantityTextView.setText("" + quantity); }
Otrzymałem następujący błąd
Do not concatenate text displayed with setText. Use resource string with placeholders.
Więc dodałem to do
strings.xml
<string name="blank">%d</string>
Który jest moim początkiem „” + miejsce na mój numer (ilość).
Uwaga : Moja
quantity
zmienna została wcześniej zdefiniowana i chciałem ją dołączyć do ciągu. W rezultacie mój kod byłprivate void displayQuantity(int quantity) { TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view); quantityTextView.setText(getString(R.string.blank, quantity)); }
Po tym mój błąd zniknął. Zachowanie w aplikacji nie zmieniło się, a moja ilość nadal wyświetlała się tak, jak chciałem, bez błędu kłaczków.
źródło
Nie łącz tekstu wewnątrz metody setText () , łącz wszystko, co chcesz w ciągu znaków i umieść tę wartość ciągu w metodzie setText () .
np. właściwy sposób
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);
Nie konkatenuj wewnątrz setText () jak
text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));
źródło
Powinieneś sprawdzić ten wątek i użyć symbolu zastępczego, takiego jak jego (nie testowane)
<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);
źródło
problem polega na tym, że dołączasz
""
na początku każdego napisu.lint skanuje argumenty przekazywane do
setText
i generuje ostrzeżenia, w Twoim przypadku istotne jest następujące ostrzeżenie:ponieważ łączysz każdy ciąg z
""
.usuń to połączenie, ponieważ argumenty, które przekazujesz, są już tekstem. Możesz również użyć,
.toString()
jeśli w ogóle jest to wymagane, gdziekolwiek indziej, zamiast łączyć swój ciąg z""
źródło
Nie szalej, to zbyt proste.
String firstname = firstname.getText().toString(); String result = "hi "+ firstname +" Welcome Here"; mytextview.setText(result);
źródło
Jeśli nie potrzebujesz obsługi i18n, możesz wyłączyć sprawdzanie kłaczków w Android Studio
Plik -> Ustawienia -> Edytor -> Inspekcje -> Android -> Lint -> Internacjonalizacja TextView (odznacz to)
źródło
Możesz tego użyć, to działa dla mnie
title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));
źródło
prodNameView.setText("" + name); //this produce lint error val nameStr="" + name;//workaround for quick warning fix require rebuild prodNameView.setText(nameStr);
źródło