Android TextView: "nie łącz tekstu wyświetlanego z setText"
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 Pierwszy to proste użycie, a drugi to ustawienie tekstu z formatowaniem tekstu.
Android Studio jest o tyle ciekawe, że użyłem Menu Analyze -> Code Cleanup
A ja mam sugestie co do powyższych dwóch linijek.
Co mogę dla tego zrobić? Czy ktoś może pomóc wyjaśnić, co to jest i co powinienem zrobić?Nie łączy tekstu wyświetlanego z setText. Use resource string z elementami zastępczymi. mniej... (Ctrl + F1)
Kiedy wywołanie TextView#setText:
- nigdy nie wywołaj numeru#toString() do formatowania liczb; nie będzie poprawnie obsługiwać separatorów ułamków i cyfr specyficznych dla locale. Rozważ używanie formatu String#z odpowiednimi specyfikacjami formatu (%d lub % f) zamiast tego.
- do wyświetlenia tekstu nie przekazuj znaków literalnych (np. "Hello"). Tekst zakodowany na twardo nie może być poprawnie przetłumaczony na inne języki. Zamiast tego rozważ użycie ciągów zasobów Androida.
- nie buduj wiadomości poprzez łączenie fragmentów tekstu. Takie wiadomości nie mogą być poprawnie przetłumaczone.
6 answers
Zasób ma przeciążoną wersję getString, która zajmuje varargs
typu Object
: getString( int, java.lang.Obiekt...). Jeśli poprawnie ustawisz swój ciąg w ciągach.xml, z poprawnymi uchwytami miejsca, można użyć tej wersji, aby pobrać sformatowaną wersję końcowego ciągu. Np.
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
Using getString(R.string.welcome_message, "Test", 0);
Android zwróci ciąg znaków z
Hello Test! you have 0 new messages
O firmie setText("" + name);
Twój pierwszy przykład, {[6] }nie ma sensu ja. TextView może obsługiwać wartości null. Jeśli nazwa jest null, żaden tekst nie zostanie narysowany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-16 08:00:53
Nie myl się z %1$s i %2$d W zaakceptowanej odpowiedzi.Oto kilka dodatkowych informacji.
- SPECYFIKATORY FORMATU mogą mieć następującą składnię:
%[
argument_index
$]format_specifier
- opcjonalny argument argument_index jest określony jako liczba kończąca się " $ " po " % " I wybiera podany argument na liście argumentów. Pierwszy argument odwołuje się do "1$", drugi przez "2$", itd.
- wymagany format jest znakiem określającym sposób sformatowania argumentu. Zbiór poprawnych konwersji dla danego argumentu zależy od typu danych argumentu.
Przykład
Utworzymy następujący sformatowany ciąg znaków, w którym szare części są wstawiane programowo.
Hello
Test
! masz0
nowe wiadomości
Twój string resource
:
Witaj,
%1$s
! Masz%2$d
nowy messages
Wykonaj string substitution
jak podano poniżej:
GetString (R. string.welcome_message,
"Test"
,0
);
Uwaga:
- %1$s zastąpi łańcuch "Test"
- %2$d zastąpi łańcuch "0"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 17:53:09
Natknąłem się na ten sam komunikat o błędzie lint 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 inicjałem "" + symbol zastępczy dla mojego numeru (ilości).
Notatka : Moja zmienna quantity
została wcześniej zdefiniowana i jest tym, co chciałem dodać do łańcucha. Mój kod w rezultacie to
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 Zmień, a moja ilość nadal wyświetlała się tak, jak chciałem, bez błędu kłaczków.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 10:34:02
Powinieneś sprawdzić ten wątek i użyć symbolu zastępczego, takiego jak jego (nie testowany)
<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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:26
Problem polega na tym, że dodajesz ""
na początku każdego ciągu.
Lint skanuje argumenty przekazywane do setText
i generuje ostrzeżenia, w Twoim przypadku ważne jest następujące ostrzeżenie:
Nie buduj wiadomości przez łączenie fragmentów tekstu. Takie wiadomości nie mogą być prawidłowo przetłumaczone.
Ponieważ łączysz każdy ciąg z ""
.
Usuń tę konkatenację, ponieważ argumenty, które przekazujesz, są już tekstowe. Możesz również użyć .toString()
, jeśli w ogóle jest to wymagane gdziekolwiek indziej, zamiast łączyć swój ciąg z ""
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-16 08:02:00
Nie konkatenuj tekstu wewnątrz metody setText () , Konkatenuj to, co chcesz w String i umieść tę wartość wewnątrz metody setText () .
Ex: poprawny 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 należy konkatenować wewnątrz setText () jak
text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 05:39:58