Android 文本视图:"Do not concatenate text displayed with setText"
Android TextView : "Do not concatenate text displayed with 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 非常有趣,我使用了 Menu Analyze -> Code Cleanup
,我得到了关于上面两行的建议。
Do not concatenate text displayed with setText. Use resource string
with placeholders. less... (Ctrl+F1)
When calling TextView#setText:
- Never call Number#toString() to format numbers; it will not handle fraction separators and locale-specific digits properly. Consider
using String#format with proper format specifications (%d or %f)
instead.
- Do not pass a string literal (e.g. "Hello") to display text. Hardcoded text can not be properly translated to other languages.
Consider using Android resource strings instead.
- Do not build messages by concatenating text chunks. Such messages can not be properly translated.
我能为此做什么?谁能帮忙解释一下这是什么东西,我该怎么办?
Resource 具有 getString 的 get 重载版本,它采用 Object
类型的 varargs
:getString(int, java.lang.Object...)。如果您在 strings.xml 中使用正确的占位符正确设置了字符串,则可以使用此版本来检索最终字符串的格式化版本。例如。
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
使用getString(R.string.welcome_message, "Test", 0);
android 将 return 一个带有
的字符串
"Hello Test! you have 0 new messages"
关于 setText("" + name);
你的第一个例子,prodNameView.setText("" + name);
对我来说没有任何意义。 TextView 能够处理空值。如果 name 为 null,则不会绘制任何文本。
你应该检查这个 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
的参数并生成警告,在您的情况下,以下警告是相关的:
Do not build messages by
concatenating text chunks. Such messages can not be properly
translated.
因为您将每个字符串与 ""
连接起来。
删除此连接,因为您传递的参数已经是文本。此外,如果在其他任何地方都需要,您可以使用 .toString()
而不是将字符串与 ""
连接
我运行进入同样的 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 错误。
不要混淆 %1$s 和 %2$d 在公认的 answer.Here 是一些额外的信息。
- 格式说明符可以是以下语法:
%[argument_index
$]format_specifier
- 可选的argument_index指定为以“%”后的“$”结尾的数字,并在参数列表中选择指定的参数。第一个参数被 "1$" 引用,第二个被 "2$" 引用,等等
- 必需的格式说明符 是一个指示参数格式的字符。给定参数的有效转换集取决于参数的 数据类型。
例子
我们将创建以下格式化字符串,其中灰色部分以编程方式插入。
Hello Test
! you have 0
new messages
你的string resource
:
< string name="welcome_messages">Hello, %1$s
! You have %2$d
new
messages< /string >
执行下面给出的string substitution
:
getString(R.string.welcome_message, "Test"
, 0
);
注:
- %1$s 将替换为字符串 "Test"
- %2$d 将替换为字符串“0”
不要在您的 setText() 方法中连接文本,在 String 中连接您想要的任何内容并将该字符串值放入其中你的 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));
如果您不需要支持 i18n,可以在 Android Studio
中禁用此 lint 检查
文件 -> 设置 -> 编辑器 -> 检查 -> Android -> Lint -> TextView 国际化(取消选中)
你可以用这个,对我有用
title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));
prodNameView.setText("" + name); //this produce lint error
val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);
别生气,太简单了
String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
mytextview.setText(result);
如果是 textView 你可以这样使用:myTextView.text = ("Hello World")
在 editText 中你可以使用 myTextView.setText("Hello World")
我使用 String.format
修复了它
之前:
textViewAddress.setText("Address"+address+"\n"+"nCountry"+"\n"+"City"+"city"+"\n"+"State"+"state")
之后:
textViewAddress.setText(
String.format("Address:%s\nCountry:%s\nCity:%s\nState:%s", address, country, city, state));
我正在按照以下方式使用 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 非常有趣,我使用了 Menu Analyze -> Code Cleanup
,我得到了关于上面两行的建议。
Do not concatenate text displayed with setText. Use resource string with placeholders. less... (Ctrl+F1)
When calling TextView#setText:
- Never call Number#toString() to format numbers; it will not handle fraction separators and locale-specific digits properly. Consider using String#format with proper format specifications (%d or %f) instead.
- Do not pass a string literal (e.g. "Hello") to display text. Hardcoded text can not be properly translated to other languages. Consider using Android resource strings instead.
- Do not build messages by concatenating text chunks. Such messages can not be properly translated.
我能为此做什么?谁能帮忙解释一下这是什么东西,我该怎么办?
Resource 具有 getString 的 get 重载版本,它采用 Object
类型的 varargs
:getString(int, java.lang.Object...)。如果您在 strings.xml 中使用正确的占位符正确设置了字符串,则可以使用此版本来检索最终字符串的格式化版本。例如。
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
使用getString(R.string.welcome_message, "Test", 0);
android 将 return 一个带有
的字符串 "Hello Test! you have 0 new messages"
关于 setText("" + name);
你的第一个例子,prodNameView.setText("" + name);
对我来说没有任何意义。 TextView 能够处理空值。如果 name 为 null,则不会绘制任何文本。
你应该检查这个 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
的参数并生成警告,在您的情况下,以下警告是相关的:
Do not build messages by concatenating text chunks. Such messages can not be properly translated.
因为您将每个字符串与 ""
连接起来。
删除此连接,因为您传递的参数已经是文本。此外,如果在其他任何地方都需要,您可以使用 .toString()
而不是将字符串与 ""
我运行进入同样的 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 错误。
不要混淆 %1$s 和 %2$d 在公认的 answer.Here 是一些额外的信息。
- 格式说明符可以是以下语法:
%[
argument_index
$]format_specifier
- 可选的argument_index指定为以“%”后的“$”结尾的数字,并在参数列表中选择指定的参数。第一个参数被 "1$" 引用,第二个被 "2$" 引用,等等
- 必需的格式说明符 是一个指示参数格式的字符。给定参数的有效转换集取决于参数的 数据类型。
例子
我们将创建以下格式化字符串,其中灰色部分以编程方式插入。
Hello
Test
! you have0
new messages
你的string resource
:
< string name="welcome_messages">Hello,
%1$s
! You have%2$d
new messages< /string >
执行下面给出的string substitution
:
getString(R.string.welcome_message,
"Test"
,0
);
注:
- %1$s 将替换为字符串 "Test"
- %2$d 将替换为字符串“0”
不要在您的 setText() 方法中连接文本,在 String 中连接您想要的任何内容并将该字符串值放入其中你的 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));
如果您不需要支持 i18n,可以在 Android Studio
中禁用此 lint 检查文件 -> 设置 -> 编辑器 -> 检查 -> Android -> Lint -> TextView 国际化(取消选中)
你可以用这个,对我有用
title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));
prodNameView.setText("" + name); //this produce lint error
val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);
别生气,太简单了
String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
mytextview.setText(result);
如果是 textView 你可以这样使用:myTextView.text = ("Hello World") 在 editText 中你可以使用 myTextView.setText("Hello World")
我使用 String.format
修复了它之前:
textViewAddress.setText("Address"+address+"\n"+"nCountry"+"\n"+"City"+"city"+"\n"+"State"+"state")
之后:
textViewAddress.setText(
String.format("Address:%s\nCountry:%s\nCity:%s\nState:%s", address, country, city, state));