Android通過(guò)String.format格式化(動(dòng)態(tài)改變)字符串資源的顯示內(nèi)容
一、實(shí)現(xiàn)效果:
最近在項(xiàng)目中需要做類似于上圖顯示的效果,里面的數(shù)字和稱謂是動(dòng)態(tài)獲取的,對(duì)于這種顯示效果,有如下兩種解決方案來(lái)處理:
(1)通過(guò)代碼動(dòng)態(tài)設(shè)置TextView的內(nèi)容,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
/** * 顯示今日狀態(tài) * * */ private void showTodayState( int totalUser, float upRate, String hornor, char level ){ StringBuilder todayStateStr = new StringBuilder( ); todayStateStr.append( 您正與 ); todayStateStr.append( totalUser ); todayStateStr.append( 位朋友在一起游戲,本周排名提升了 ); todayStateStr.append( upRate ); todayStateStr.append( ,獲得 ); todayStateStr.append( hornor ); todayStateStr.append( 的稱號(hào),等級(jí)為 ); todayStateStr.append( level ); todayStateStr.append( ! ); mTodayStateTxt.setText( todayStateStr ); } |
然后調(diào)用該方法:
1
|
showTodayState( 1234567 , 68 .376f, 爆頭大師, ‘B‘ ); |
(2)在string.xml文件中定義一個(gè)字符串,然后在代碼中通過(guò)String.format方法來(lái)格式化該字符串,比如:
1
|
<string name= "today_state_string" >您正與% 1 $d位朋友在一起游戲,本周排名提升了% 2 $.3f,獲得% 3 $s的稱號(hào),等級(jí)為% 4 $c!</string> |
在代碼中做如下定義:
1
2
3
4
5
6
7
8
|
/** * 顯示今日狀態(tài) * * */ private void showTodayState( int totalUser, float upRate, String hornor, char level ){ String todayStateStr = String.format( getResources( ).getString( R.string.today_state_string), totalUser, upRate, hornor, level ); mTodayStateTxt.setText( todayStateStr ); } |
本文介紹第二種處理方式,因?yàn)轱@然第二種處理方式更方便,特別是需要?jiǎng)討B(tài)改變多個(gè)顯示狀態(tài)的時(shí)候。
二、字符串資源格式化詳細(xì)介紹:
1
|
<string name= "today_state_string" >您正與% 1 $d位朋友在一起游戲,本周排名提升了% 2 $.3f,獲得% 3 $s的稱號(hào),等級(jí)為% 4 $c!</string> |
從上面這行字符串的定義可以看出,格式化字符串資源的格式為:
%+參數(shù)位置+$+格式化類型,其中:
參 數(shù) 位 置:從1開(kāi)始依次編號(hào),String.forma方法的第二個(gè)參數(shù)為格式化的第一個(gè)參數(shù),后面依次遞增;
格式化類型:
s 字符串
f 浮點(diǎn)數(shù)
d 整型數(shù)
c 字符類型
其實(shí)懂點(diǎn)C語(yǔ)言的朋友一看就知道和printf的打印輸出格式化差不多。
三、注意事項(xiàng):
1、在string.xml文件中定義好格式化的字符串資源,通過(guò)代碼動(dòng)態(tài)設(shè)置字符串內(nèi)容時(shí),必須確保String.format方法里面的參數(shù)不少于字符串資源中定義的格式化參數(shù)個(gè)數(shù)(實(shí)踐證明多了參數(shù)是不會(huì)報(bào)異常的),比如在上面的例子中字符串有四個(gè)格式化參數(shù),如果代碼寫成這樣:
1
|
showTodayState( int totalUser, float upRate, String hornor ) //少了level參數(shù) |
則會(huì)報(bào)如下異常: