1. 程式人生 > >TextView.setText提示Do not concatenate text displayed with setText. Use resource string with placehold

TextView.setText提示Do not concatenate text displayed with setText. Use resource string with placehold

挖坑背景

在實際的專案開發過程中,我們會經常用到TextView.setText()方法,而在進行某些單位設定時,比如 設定時間xxxx年xx月xx日 或者設定 體重xx公斤* 時,大家一般都會使用如下寫法:

// 設定顯示當前日期
TextView tvDate = (TextView) findViewById(R.id.main_tv_date);
tvDate.setText("當前日期:" + year + "年" + month + "月" + day + "日");

// 設定顯示當前體重數值
TextView tvWeight = (TextView) findViewById(R.id.main_tv_weight);
tvWeight.setText("當前體重:" + weight + "公斤");

 

那麼…如果你是在Android Studio上進行開發的話,你在使用該方式進行文字設定時就會看到以下提示:
在這裡插入圖片描述
問題分析

Ok,相信上圖的問題是絕大多數的強迫症患者、完美主義者所不能容忍的,那麼我們就來看看它到底想要怎麼做才能夠不折磨咱們!!!先分析AS給出的提示資訊:

Do not concatenate text displayed with setText. Use resource string with placeholders. [less...](#lint/SetTextI18n) (Ctrl+F1 Alt+T)
請勿使用setText方法連線顯示文字.用佔位符使用字串資源(提示我們儘量使用strings.xml的字串來顯示文字)。
When calling TextView#setText
當使用TextView#setText方法時
* Never call Number#toString() to format numbers; it will not handle fraction separators and  locale-specific digits
* 不使用Number#toString()格式的數字;它不會正確地處理分數分隔符和特定於地區的數字。
 properly. Consider using String#format with proper format specifications (%d or %f)  instead.
考慮使用規範格式(%d或%f)的字串來代替。
* 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.
考慮使用Android資源字串。
* Do not build  messages by concatenating text chunks. Such messages can not be properly  translated.
不要通過連線建立訊息文字塊。這樣的資訊不能被正確的翻譯。

通過以上資訊,我們可以得知:

不建議使用Numer.toString()的方式來進行字串的轉換,建議使用規範格式(%d或%f)的字串來代替;
不建議直接使用字串文字來直接顯示文字,建議直接使用Android字串資源;
不建議通過連線的方式顯示訊息文字塊。

解決方法

通過上述對問題的分析解讀,我們上述類似問題所引發的警告可以通過如下方式更規範化的使用TextView.setText()方法:

使用String.format方法
在strings.xml中進行如下宣告(這裡以日期設定為例)

<string name="current_time">當前日期:%1$d年%2$d月%3$d日</string>

在程式碼中這樣使用

// 設定顯示當前日期
TextView tvDate = (TextView) findViewById(R.id.main_tv_date);
tvDate.setText(String.format(getResources().getString(R.string.current_time),year,month,day));
 
String.format常用格式說明:
%n 代表當前為第幾引數,使strings.xml中的位置與format引數的位置對應;
$s代表為字串數值;$d代表為整數數值;$f代表為浮點型數值。
如:%1$d代表第一個引數,數值型別為整數。

使用Android字串資源來替換字串文字