Android TextView:“不要将显示的文本与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工作室是如此有趣,我使用菜单Analyze -> Code Cleanup,我得到了上面两行的建议。

enter image description here

不要将显示的文本与SetText连接在一起。使用资源字符串 带占位符。更少..(Ctrl+F1)

当调用文本视图#设置文本:

  • 永远不要调用数字#ToString()来格式化数字;它不能正确处理分数分隔符和特定于区域设置的数字。考虑一下 使用具有正确格式规范(%d或%f)的字符串#格式 相反。
  • 不要传递字符串文字(例如“ Hello ”)来显示文本。硬编码文本无法正确翻译为其他语言。 请考虑改用Android资源字符串。
  • 不要通过连接文本块来构建消息。这样的信息无法正确翻译。

我能为此做些什么?任何人都可以帮助解释这件事是什么,我应该怎么做?

135964 次浏览

资源具有getString的get重载版本,该版本采用类型__abc1:__abc2的__abc0。如果您在strings.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,则不会绘制任何文本。

您应该检查此线,并使用类似于HIS的占位符(未测试)

<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(),而不是将字符串与""连接在一起。

我遇到了同样的线头错误信息,并用这种方法解决了它。

最初我的代码是:

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

在这之后,我的错误消失了。应用程序中的行为没有改变,我的数量继续显示为我想要的,现在没有线头错误。

不要与公认答案中的%1$s%2$d混淆。这里有一些额外的信息。

  • 格式说明符可以采用以下语法:

%[argument_index$]format_specifier

  1. 可选的参数_索引被指定为一个在“%”后以“$”结尾的数字,并选择参数列表中指定的参数。第一个参数由"1$"引用,第二个参数由"2$"引用,依此类推。
  2. 所需的格式说明符是指示应如何格式化变元的字符。给定参数的有效转换集取决于该参数的__abc1

例子

我们将创建以下格式化字符串,其中灰色部分以编程方式插入。

你好,Test!您有0新留言

您的string resource

<;string name=“欢迎_消息”>您好,%1$s!你有__ABC 1新。 消息<;/string>

string substitution,如下所示:

getString(R.string.Welcome_消息,__abc0,__abc1);

注意:

  • %1$s将替换为字符串“ test ”
  • %2$d将被字符串“ 0 ”替换

不要在你的设置文本()方法中连接文本,在字符串中连接任何你想要的东西,并将字符串值放入你的设置文本()方法中。

正确的方法

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

我知道我回答这个问题太晚了,但我认为你可以先将数据存储在变量中,然后再提供变量名称。例如:-

// Java syntax
String a = ("" + name);
String b = "" + String.format(getString(R.string.string_product_rate_with_ruppe_sign);
String c = "" + new BigDecimal(price).setScale(2, RoundingMode.UP));
    

prodNameView.setText(a);
prodOriginalPriceView.setText(b, c);