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 ответов:
ресурс имеет перегруженную версию 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
- необязательный элемент argument_index указывается как число, заканчивающееся на " $ "после" % " и выбирает указанный аргумент в списке аргументов. Первый аргумент, на который ссылается "1$", второй -"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));