Android TextView:"不要连接用setText显示的文本"

时间:2015-10-16 07:32:46

标签: android concatenation textview string-concatenation

我按照以下方式使用 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 ,我得到了以上两行的建议。

enter image description here

  

不要连接用setText显示的文本。使用资源字符串   与占位符。少...(Ctrl + F1)

     

调用 TextView#setText:

时      
      
  • 永远不要调用Number#toString()来格式化数字;它不会正确处理分数分隔符和特定于语言环境的数字。考虑   使用具有适当格式规范的String#格式(%d或%f)   代替。
  •   
  • 不要传递字符串文字(例如" Hello")来显示文字。硬编码文本无法正确翻译为其他语言。   请考虑使用Android资源字符串。
  •   
  • 不要通过连接文本块来构建消息。此类消息无法正确翻译。
  •   

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

10 个答案:

答案 0 :(得分:233)

资源具有获取重载版本的getString,它采用varargs类型ObjectgetString(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

  1. 可选的 argument_index 被指定为在“%”之后以“$”结尾的数字,并在参数列表中选择指定的参数。第一个参数由&#34; 1 $&#34; 引用,第二个参数由&#34; 2 $&#34; 等引用。
  2. 所需的格式说明符是一个字符,指示应如何格式化参数。给定参数的有效转换集取决于参数的数据类型。
  3. 示例

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

      

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

    注意:

    • %1 $ s将以字符串&#34; Test&#34;
    • 代替
    • %2 $ d将以字符串&#34; 0&#34;
    • 代替

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