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.

Tutaj wpisz opis obrazka

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.
Co mogę dla tego zrobić? Czy ktoś może pomóc wyjaśnić, co to jest i co powinienem zrobić?
Author: Pratik Butani, 2015-10-16

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.

 204
Author: Blackbelt,
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

  1. 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.
  2. 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! masz 0 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"
 10
Author: Rissmon Suresh,
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.

 10
Author: user1580203,
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);
 6
Author: ThomasThiebaud,
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 ""

 2
Author: Rahul Tiwari,
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));
 0
Author: Ashana.Jackol,
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