問題背景
在實際的項目開發(fā)過程中属提,我們會經(jīng)常用到TextView.setText()方法,而在進行某些單位設(shè)置時,比如 設(shè)置時間xxxx年xx月xx日 或者設(shè)置 體重xx公斤* 時盐碱,大家一般都會使用如下寫法:
// 設(shè)置顯示當(dāng)前日期
TextView tvDate = (TextView) findViewById(R.id.main_tv_date);
tvDate.setText("當(dāng)前日期:" + year + "年" + month + "月" + day + "日");
// 設(shè)置顯示當(dāng)前體重數(shù)值
TextView tvWeight = (TextView) findViewById(R.id.main_tv_weight);
tvWeight.setText("當(dāng)前體重:" + weight + "公斤");
那么...如果你是在Android Studio上進行開發(fā)的話楼誓,你在使用該方式進行文本設(shè)置時就會看到以下提示:
問題分析
Ok玉锌,相信上圖的問題是絕大多數(shù)的強迫癥患者、完美主義者所不能容忍的疟羹,那么我們就來看看它到底想要怎么做才能夠不折磨咱們V魇亍Y骶蟆!先分析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
當(dāng)使用TextView#setText方法時
* Never call Number#toString() to format numbers; it will not handle fraction separators and locale-specific digits
* 不使用Number#toString()格式的數(shù)字救湖;它不會正確地處理分數(shù)分隔符和特定于地區(qū)的數(shù)字。
properly. Consider using String#format with proper format specifications (%d or %f) instead.
考慮使用規(guī)范格式(%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()的方式來進行字符串的轉(zhuǎn)換检吆,建議使用規(guī)范格式(%d或%f)的字符串來代替;
- 不建議直接使用字符串文字來直接顯示文本程储,建議直接使用Android字符串資源蹭沛;
- 不建議通過連接的方式顯示消息文本塊。
解決方法
通過上述對問題的分析解讀章鲤,我們上述類似問題所引發(fā)的警告可以通過如下方式更規(guī)范化的使用TextView.setText()方法:
- 使用String.format方法
- 在strings.xml中進行如下聲明(這里以日期設(shè)置為例)
<string name="current_time">當(dāng)前日期:%1$d年%2$d月%3$d日</string>
- 在代碼中這樣使用
// 設(shè)置顯示當(dāng)前日期
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 代表當(dāng)前為第幾參數(shù)摊灭,使strings.xml中的位置與format參數(shù)的位置對應(yīng);
d代表為整數(shù)數(shù)值帚呼;d代表第一個參數(shù)皱蹦,數(shù)值類型為整數(shù)煤杀。
- 使用Android字符串資源來替換字符串文字
看到這里,是不是徹底了解如何改造了沪哺?既然都懂了沈自,那我的贊呢?