TextView.setText提示Do not concatenate text displayed with setText. Use resource string with placehold
阿新 • • 發佈:2018-11-26
挖坑背景
在實際的專案開發過程中,我們會經常用到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字串資源來替換字串文字