Android TextView: "не объединяйте текст, отображаемый с помощью setText"


Я устанавливаю текст с помощью 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.
  • не создавайте сообщения путем объединения фрагментов текста. Такие сообщения не могут быть правильно переведены.

что я могу сделать для этого? Кто-нибудь может помочь объяснить, что это такое и что мне делать?

6 81

6 ответов:

ресурс имеет перегруженную версию getString, которая принимает varargs типа Object:getString (int, java.ленг.Объект...). Если вы правильно настроили свою строку в строках.xml, с правильными держателями мест, вы можете использовать эту версию для получения отформатированной версии вашей последней строки. Е. Г.

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

используя getString(R.string.welcome_message, "Test", 0);

android вернет строку с

 Hello Test! you have 0 new messages

о setText("" + name);

ваш первый пример, prodNameView.setText("" + name); не имеет никакого смысла для меня. TextView может обрабатывать нулевые значения. Если name имеет значение null, текст не будет отображаться.

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

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

%[argument_index$]format_specifier

  1. необязательный элемент argument_index указывается как число, заканчивающееся на " $ "после" % " и выбирает указанный аргумент в списке аргументов. Первый аргумент, на который ссылается "1$", второй -"2$" и т. д.
  2. необходимые формата является символом, указывающим, как аргумент должен быть отформатирован. Набор допустимых преобразований для данного аргумента зависит от аргумента тип данных.

пример

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

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

код string resource:

Здравствуйте,%1$s! У вас есть %2$d новый сообщения

сделать string substitution, как указано ниже:

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

Примечание:

  • %1$S, там будет подстановка по строке "Test"
  • %2$d будет заменено строкой "0"

я столкнулся с тем же сообщением об ошибке 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));
}

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

вы должны проверить это thread и использовать заполнитель, как его один (не проверено)

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

проблема в том, что вы добавляете "" в начале каждой строки.

lint будет сканировать аргументы, передаваемые в setText и будет генерировать предупреждения, в вашем случае следующее предупреждение актуален:

не создавать сообщения с помощью объединение фрагментов текста. Такие сообщения не могут быть правильно переведенный.

как вы объединяете каждую строку с "".

удалите эту конкатенацию как аргументы, которые вы передаете, уже являются текстом. Кроме того, вы можете использовать .toString() если вообще требуется в другом месте, а не конкатенации строки с ""

не объединяйте текст внутри вашего setText () метод, объединить то, что вы хотите в строка и поместите это строковое значение внутри вашего setText () метод.

пример: правильный путь

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

не конкатенация внутри setText () как

text.setText(hrs+":"+String.format("%02d", mins)+":"+String.format("%02d", secs));