Android TextView:“不要连接显示的文本与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非常有趣,我使用了菜单Analyze -> Code Cleanup并在上面两行提出了build议。

在这里输入图像说明

不要连接用setText显示的文本。 使用占位符的资源string。 less…(Ctrl + F1)

当调用TextView#setText时:

  • 切勿调用Number#toString()来格式化数字; 它不会正确处理分数分隔符和区域特定的数字。 考虑使用具有适当格式规范(%d或%f)的String#格式。
  • 不要传递string(例如“Hello”)来显示文本。 硬编码文本无法正确翻译成其他语言。 考虑使用Android资源string。
  • 不要通过连接文本块来构build消息。 这样的消息不能被正确翻译。

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

Resource具有getString的get重载版本,它接受一个Objectvarargs : getString(int,java.lang.Object …) 。 如果在strings.xml中使用正确的占位符正确设置了string,则可以使用此版本检索最终string的格式化版本。 例如

 <string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string> 

使用getString(R.string.welcome_message, "Test", 0);

android会返回一个String

  Hello Test! you have 0 new messages 

关于 setText("" + name);

你的第一个例子, prodNameView.setText("" + name); 对我没有任何意义。 TextView能够处理空值。 如果name为null,则不会绘制文本。

我遇到了同样的错误消息,并通过这种方式解决。

最初我的代码是这样的:

 private void displayQuantity(int quantity) { TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view); quantityTextView.setText("" + quantity); } 

我得到错误“不要连接文本显示与setText。使用资源string与占位符。 所以

我将其添加到strings.xml

 <string name="blank">%d</string> 

这是我最初的“”+我的号码(数量)的占位符。

注意:我的数量variables是以前定义的,并且是我想追加到string的。 在我写的Java代码中。

 private void displayQuantity(int quantity) { TextView quantityTextView = (TextView) findViewById(R.id.quantity_text_view); quantityTextView.setText(getString(R.string.blank, quantity)); } 

我的错误消失了 在应用程序的行为没有改变,我的数量继续显示,因为我想现在没有lint错误。

你应该检查这个线程,并使用像他的一个占位符(未testing)

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

问题是因为你在每个string的开头都追加""

lint将扫描传递给setText参数,并将生成警告,在您的情况下,警告是相关的:

不要通过连接文本块来构build消息。 这样的消息不能被正确翻译。

因为您将每个string连接到""

删除这个连接,因为你传递的参数已经是文本了。 另外,如果在其他任何地方需要使用.toString() ,而不是将string连接到""