不可不知的Android strings.xml那些事
strings.xml 有很多需要注意的地方和一些小技巧,知道了這些可以讓你的 Android 應(yīng)用更加規(guī)范易用,感興趣的小伙伴們可以參考一下
不要復(fù)用
這一條可能很多人會(huì)有不同的意見(jiàn),因?yàn)閺V為流行的編程理念就在教導(dǎo)我們要復(fù)用代碼,當(dāng)然代碼復(fù)用是很好的理念,可以讓程序更加簡(jiǎn)潔。但也容易形成什么都想復(fù)用的思維慣性,而這在某些場(chǎng)景下就可能會(huì)造成麻煩。
比如,想象下你在應(yīng)用中的登錄和注冊(cè)界面中都是用了相同的字符串 – R.string.loading.
<string name="loading">Loading...</string>
之后如果產(chǎn)品需求變更,要分別使用不同的提示語(yǔ),那就不得不新創(chuàng)建兩個(gè) string 并在代碼中配置它們。所以如果從一開(kāi)始就為不同頁(yè)面分別配置,那需要做的就僅僅是修改下 strings.xml 文件。
<string name="sign_in_loading">正在登錄...</string>
<string name="sign_up_loading">正在注冊(cè)...</string>
更容易忽略的一個(gè)原因是,如果你們的應(yīng)用不想只是面對(duì)國(guó)內(nèi)用戶,還要面對(duì)其他語(yǔ)系的用戶的話,有些語(yǔ)言可能會(huì)造成意想不到的問(wèn)題。
因?yàn)橐恍┱Z(yǔ)言同樣一個(gè)意思在不同的語(yǔ)境下,會(huì)用到不同的單詞,個(gè)中滋味經(jīng)歷過(guò)的自然會(huì)懂。
良好的文件結(jié)構(gòu)
<!-- register start --> <string name="register_username">用戶名</string> <string name="register_password">密碼</string> <!-- register end --> <!-- login start --> <string name="login_username">用戶名</string> <string name="login_password">密碼</string> <!-- login end -->
千萬(wàn)不要對(duì)此覺(jué)得麻煩,使用這樣的方式來(lái)組織 strings.xml 文件,在應(yīng)用變得復(fù)雜后,還能夠很簡(jiǎn)單的通過(guò)搜索甚至觀察的方式來(lái)找出你想要修改的字符串。
格式化
千萬(wàn)不要使用字符串拼接的方法,因?yàn)椴煌Z(yǔ)言的句子順序是多樣的,字符串拼接會(huì)讓你的邏輯非常復(fù)雜。
這個(gè)時(shí)候就可以考慮使用字符串格式化了:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
%1$s 代表了會(huì)格式化的字符串,%2$d 代表了會(huì)格式化的數(shù)值并在第二的位置,大家可以以此類(lèi)推。
// Java 代碼: Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); // 注意參數(shù)的順序。 復(fù)數(shù)名詞
不要像下面這樣在你的 Java 代碼中處理單詞復(fù)數(shù)問(wèn)題,因?yàn)椴煌恼Z(yǔ)言針對(duì)復(fù)數(shù)會(huì)有不同的語(yǔ)法規(guī)則。
<!-- strings.xml start -->
<string name="book">book</string>
<string name="books">books</string>
<!-- strings.xml end -->
if (bookCount == 0) {
text = getString(R.string.book);
} else {
text = getString(R.string.books);
}
正確的做法應(yīng)該是使用 getQuantityString(int id, int quantity) 方法。
<plurals name="book"> <item name="one">book</item> <item name="others">books</item> </plurals> int bookCount = 4; Resources res = getResources(); String bookCount = res.getQuantityString(R.plurals.book, bookCount); // result: books.
當(dāng)然 Quantity String 不僅支持 one,還支持 zero, two, few, many 和 other。
可以自由決定各自情況下,使用什么詞語(yǔ)(當(dāng)然,在中文環(huán)境下可能用處并不大)。
并且 Quantity String 也能和上面提到的格式化搭配使用:
<plurals name="book"> <item name="one">%d book found.</item> <item name="others">%d books found.</item> </plurals> int count = 4; Resources res = getResources(); String bookCount = res.getQuantityString(R.plurals.book, count, count); // result: 4 books found.
谷歌官方建議,作為一個(gè)開(kāi)發(fā)者至少應(yīng)該給名詞提供 ‘one' 和 ‘other' 屬性。
文本高亮
大家可能知道用 ForegroundColorSpan 或 SpannableStringBuilder 能夠高亮一段文本中的某些內(nèi)容,但這對(duì)于多語(yǔ)言應(yīng)用來(lái)說(shuō)可能并不是最好的方式,因?yàn)檫@兩個(gè)方法都要依靠待高亮文字的具體位置作為參數(shù)。如果應(yīng)用需要支持的語(yǔ)言多了之后,這就會(huì)寫(xiě)大量的 Java 代碼,和頻繁計(jì)算待高亮內(nèi)容位置。
這個(gè)時(shí)候就可以試試用 HTML:
<string name="html_text" formatted="false"> <![CDATA[ <font color=\'#28b5f5\'>Hello</font> world. ]]> </string> TextView tv = (TextView) findViewById(R.id.tv_txt); tv.setText(Html.fromHtml(getString(R.string.html_text)));
這其實(shí)也是格式化的一種,我們不僅能定義顏色,還可以使用 < b >、< i >、< u > 來(lái)分別使字符串具有加粗、斜體和下劃線。
其實(shí) strings.xml 的用法遠(yuǎn)沒(méi)有很多人想的那么簡(jiǎn)單,這里也算是拋磚迎玉一下,如果大家想要了解更詳細(xì)的用法,可以參考官方文檔。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android中 自定義數(shù)據(jù)綁定適配器BaseAdapter的方法
本篇文章小編為大家介紹,Android中 自定義數(shù)據(jù)綁定適配器BaseAdapter的方法。需要的朋友參考下2013-04-04
Android中activity從創(chuàng)建到顯示的基本介紹
這篇文章主要給大家介紹了關(guān)于Android中activity從創(chuàng)建到顯示的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android初學(xué)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2017-11-11
Android中使用ViewFlipper進(jìn)行手勢(shì)切換實(shí)例
這篇文章主要介紹了Android中使用ViewFlipper進(jìn)行手勢(shì)切換的方法,以實(shí)例形式詳細(xì)講述了XML文件的定義及功能函數(shù)的實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下2014-10-10
Android實(shí)現(xiàn)幾種推送方式解決方案
推送功能在手機(jī)開(kāi)發(fā)中應(yīng)用的場(chǎng)景是越來(lái)起來(lái)了,本篇文章主要介紹了Android實(shí)現(xiàn)幾種推送方式解決方案 ,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12
Flutter網(wǎng)絡(luò)請(qǐng)求庫(kù)DIO的基本使用
這篇文章主要介紹了Flutter網(wǎng)絡(luò)請(qǐng)求庫(kù)DIO的基本使用,幫助大家更好的理解和學(xué)習(xí)使用Flutter,感興趣的朋友可以了解下2021-04-04
react native打包apk文件安裝好之后進(jìn)入應(yīng)用閃退的解決方案
這篇文章主要介紹了react native打包apk文件安裝好之后進(jìn)入應(yīng)用閃退的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Android?AMS啟動(dòng)App進(jìn)程原理分析
這篇文章主要介紹了Android?AMS啟動(dòng)App進(jìn)程原理,系統(tǒng)fork函數(shù)是如何創(chuàng)建進(jìn)程,文中有詳細(xì)的代碼示例,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-05-05
Android中SharedPreference使用實(shí)例講解
這篇文章主要介紹了Android中SharedPreference使用方法,實(shí)現(xiàn)登陸界面記住密碼功能,感興趣的小伙伴們可以參考一下2016-01-01
Android通過(guò)bin二進(jìn)制程序調(diào)用jar原理
最近在研究monkey測(cè)試,發(fā)現(xiàn)monkey測(cè)試的代碼都是JAVA編寫(xiě)的,通過(guò)編譯生成jar包,而我們?cè)趫?zhí)行測(cè)試時(shí)直接執(zhí)行/system/bin/monkey這個(gè)二進(jìn)制程序的,那么它是如何能調(diào)起java程序的呢,本文小編給大家介紹了Android通過(guò)bin二進(jìn)制程序調(diào)用jar原理,需要的朋友可以參考下2023-10-10

