Android TextView: «Не конкатенировать текст, отображаемый с помощью setText»


Answers

Я столкнулся с тем же сообщением об ошибке lint и решил его таким образом.

Первоначально мой код был:

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

Я получил следующую ошибку

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

Итак, я добавил это к strings.xml

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

Который является моим первоначальным «" + заполнителем для моего количества (количества).

Примечание . Моя переменная quantity была определена ранее и является тем, что я хотел добавить в строку. Мой код в результате был

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

После этого моя ошибка исчезла. Поведение в приложении не изменилось, и мое количество продолжало отображаться, как я этого хотел, без ошибки ворса.

Question

Я устанавливаю текст с помощью setText () следующим образом.

prodNameView.setText("" + name);

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

В этом первом - простое использование, а во втором - текст с форматированием текста.

Android Studio настолько интересна, я использовал меню Analyze -> Code Cleanup и у меня появилось предложение на двух строках.

Не объединяйте текст, отображаемый с помощью setText. Используйте строку ресурсов с заполнителями. меньше ... (Ctrl + F1)

При вызове TextView # setText:

  • Никогда не вызывайте Number # toString () для форматирования чисел; он не будет правильно обрабатывать разделители фракций и соответствующие языковым значениям. Вместо этого используйте формат String # с соответствующими спецификациями формата (% d или% f).
  • Не передавайте строковый литерал (например, «Hello») для отображения текста. Жестко закодированный текст нельзя перевести на другие языки. Вместо этого рассмотрите использование строк ресурса Android.
  • Не создавайте сообщения, объединяя текстовые фрагменты. Такие сообщения нельзя надлежащим образом перевести.

Что я могу сделать для этого? Любой может помочь объяснить, что это такое и что я должен делать?




Не путайте с % 1 $ s и % 2 $ d в принятом ответе. Вот несколько дополнительных сведений.

  • Спецификаторы формата могут иметь следующий синтаксис:

% [ argument_index $] format_specifier

  1. Необязательный аргумент_индекс указывается как число, заканчивающееся «$» после «%», и выбирает указанный аргумент в списке аргументов. Первый аргумент ссылается на «1 $» , второй - на «2 $» и т. Д.
  2. Обязательным спецификатором формата является символ, указывающий способ форматирования аргумента. Набор действительных преобразований для данного аргумента зависит от типа данных аргумента .

пример

Мы создадим следующую форматированную строку, в которой серые части будут вставлены программно.

Привет Test ! у вас есть 0 новых сообщений

Ваш string resource :

<string name = "welcome_messages"> Привет, %1$s ! У вас есть %2$d новых сообщений </ string>

Сделайте string substitution как показано ниже:

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

Заметка:

  • % 1 $ s будет подстрокой по строке «Тест»
  • % 2 $ d будет подстрокой по строке "0"