我按照以下方式使用 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资源字符串。
- 不要通过连接文本块来构建消息。此类消息无法正确翻译。
我能为此做些什么?任何人都可以帮助解释这是什么,我该怎么办?
答案 0 :(得分:233)
资源具有获取重载版本的getString,它采用varargs
类型Object
: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会返回一个带
的字符串 Hello Test! you have 0 new messages
关于 setText("" + name);
您的第一个示例,prodNameView.setText("" + name);
对我没有任何意义。 TextView能够处理空值。如果name为null,则不会绘制任何文本。
答案 1 :(得分:22)
请勿在接受的答案中与%1 $ s 和%2 $ d 混淆。这里有一些额外的信息。
%[
argument_index
$]format_specifier
示例强>
我们将创建以下格式化字符串,其中以编程方式插入灰色部分。
您好
Test
!您有0
条新消息
您的string resource
:
&LT;字符串名称=&#34; welcome_messages&#34;&gt;您好,
%1$s
!你有%2$d
新的 消息&LT; / string&gt;
执行以下string substitution
:
getString(R.string.welcome_message,
"Test"
,0
);
注意:
答案 2 :(得分:13)
我遇到了同样的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>
这是我最初的&#34;&#34; +我的号码(数量)的占位符。
注意:我之前定义了quantity
变量,这是我想要附加到字符串的内容。结果我的代码是
private void displayQuantity(int quantity) {
TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view);
quantityTextView.setText(getString(R.string.blank, quantity));
}
在此之后,我的错误消失了。应用程序中的行为没有改变,我的数量继续显示,因为我现在没有lint错误。
答案 3 :(得分:8)
你应该检查这个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);
答案 4 :(得分:8)
请勿在 setText()方法内连接文本,在 String 中连接所需内容,并将该String值放入 setText()< / strong>方法。
ex:正确的方法
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));
答案 5 :(得分:4)
问题是因为您在每个字符串的开头附加""
。
lint将扫描传递给setText
的参数并生成警告,在您的情况下警告相关:
不要通过构建消息 连接文本块。这样的消息不能正常 平移。
因为您将每个字符串与""
连接在一起。
删除此连接,因为您传递的参数已经是文本。此外,如果在其他地方需要,您可以使用.toString()
,而不是将字符串与""
连接
答案 6 :(得分:1)
别生气,太简单了。
String firstname = firstname.getText().toString();
String result = "hi "+ firstname +" Welcome Here";
mytextview.setText(result);
答案 7 :(得分:0)
如果您不需要支持i18n,则可以在Android Studio中禁用此皮棉检查
文件->设置->编辑器->检查->安卓->棉绒-> TextView国际化(取消选中)
答案 8 :(得分:0)
您可以使用它,它对我有用
title.setText(MessageFormat.format("{0} {1}", itemList.get(position).getOppName(), itemList.get(position).getBatchNum()));
答案 9 :(得分:0)
prodNameView.setText("" + name); //this produce lint error
val nameStr="" + name;//workaround for quick warning fix require rebuild
prodNameView.setText(nameStr);