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 类型的 varargsgetString(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

  1. 可选的argument_index指定为以“%”后的“$”结尾的数字,并在参数列表中选择指定的参数。第一个参数被 "1$" 引用,第二个被 "2$" 引用,等等
  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));