不可不知的Android strings.xml那些事
strings.xml 有很多需要注意的地方和一些小技巧,知道了這些可以讓你的 Android 應用更加規(guī)范易用,感興趣的小伙伴們可以參考一下
不要復用
這一條可能很多人會有不同的意見,因為廣為流行的編程理念就在教導我們要復用代碼,當然代碼復用是很好的理念,可以讓程序更加簡潔。但也容易形成什么都想復用的思維慣性,而這在某些場景下就可能會造成麻煩。
比如,想象下你在應用中的登錄和注冊界面中都是用了相同的字符串 – R.string.loading.
<string name="loading">Loading...</string>
之后如果產(chǎn)品需求變更,要分別使用不同的提示語,那就不得不新創(chuàng)建兩個 string 并在代碼中配置它們。所以如果從一開始就為不同頁面分別配置,那需要做的就僅僅是修改下 strings.xml 文件。
<string name="sign_in_loading">正在登錄...</string>
<string name="sign_up_loading">正在注冊...</string>
更容易忽略的一個原因是,如果你們的應用不想只是面對國內(nèi)用戶,還要面對其他語系的用戶的話,有些語言可能會造成意想不到的問題。
因為一些語言同樣一個意思在不同的語境下,會用到不同的單詞,個中滋味經(jīng)歷過的自然會懂。
良好的文件結(jié)構
<!-- 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 -->
千萬不要對此覺得麻煩,使用這樣的方式來組織 strings.xml 文件,在應用變得復雜后,還能夠很簡單的通過搜索甚至觀察的方式來找出你想要修改的字符串。
格式化
千萬不要使用字符串拼接的方法,因為不同語言的句子順序是多樣的,字符串拼接會讓你的邏輯非常復雜。
這個時候就可以考慮使用字符串格式化了:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
%1$s 代表了會格式化的字符串,%2$d 代表了會格式化的數(shù)值并在第二的位置,大家可以以此類推。
// Java 代碼: Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); // 注意參數(shù)的順序。 復數(shù)名詞
不要像下面這樣在你的 Java 代碼中處理單詞復數(shù)問題,因為不同的語言針對復數(shù)會有不同的語法規(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); }
正確的做法應該是使用 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.
當然 Quantity String 不僅支持 one,還支持 zero, two, few, many 和 other。
可以自由決定各自情況下,使用什么詞語(當然,在中文環(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.
谷歌官方建議,作為一個開發(fā)者至少應該給名詞提供 ‘one' 和 ‘other' 屬性。
文本高亮
大家可能知道用 ForegroundColorSpan 或 SpannableStringBuilder 能夠高亮一段文本中的某些內(nèi)容,但這對于多語言應用來說可能并不是最好的方式,因為這兩個方法都要依靠待高亮文字的具體位置作為參數(shù)。如果應用需要支持的語言多了之后,這就會寫大量的 Java 代碼,和頻繁計算待高亮內(nèi)容位置。
這個時候就可以試試用 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)));
這其實也是格式化的一種,我們不僅能定義顏色,還可以使用 < b >、< i >、< u > 來分別使字符串具有加粗、斜體和下劃線。
其實 strings.xml 的用法遠沒有很多人想的那么簡單,這里也算是拋磚迎玉一下,如果大家想要了解更詳細的用法,可以參考官方文檔。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android實現(xiàn)拍照及圖片裁剪(6.0以上權限處理及7.0以上文件管理)
本篇文章主要介紹了Android實現(xiàn)拍照及圖片裁剪(6.0以上權限處理及7.0以上文件管理),非常具有實用價值,需要的朋友可以參考下2017-10-10Android Secret Code(輸入字符彈出手機信息)詳解
這篇文章主要介紹了Android Secret Code(輸入字符彈出手機信息)詳解的相關資料,需要的朋友可以參考下2016-11-11Android實現(xiàn)文件上傳和下載倒計時功能的圓形進度條
這篇文章主要介紹了Android實現(xiàn)文件上傳和下載倒計時功能的圓形進度條,需要的朋友可以參考下2017-09-09Android開發(fā)實現(xiàn)從相冊中選擇照片功能詳解
這篇文章主要介紹了Android開發(fā)實現(xiàn)從相冊中選擇照片功能,涉及Android權限控制、事件綁定、文件路徑與獲取等相關操作技巧,需要的朋友可以參考下2019-03-03Android 實現(xiàn)徹底退出自己APP 并殺掉所有相關的進程
這篇文章主要介紹了Android 實現(xiàn)徹底退出自己APP 并殺掉所有相關的進程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03詳解Android WebView的input上傳照片的兼容問題
本篇文章主要介紹了詳解Android WebView的input上傳照片的兼容問題,非常具有實用價值,需要的朋友可以參考下2017-08-08Android中的Intent Filter匹配規(guī)則簡介
這篇文章主要為大家詳細介紹了Android中的Intent Filter匹配規(guī)則,感興趣的小伙伴們可以參考一下2016-04-04flutter InheritedWidget使用方法總結(jié)
這篇文章主要為大家介紹了flutter InheritedWidget使用方法總結(jié)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11Android 中TabLayout自定義選擇背景滑塊的實例代碼
TabLayout是Android 的Material Design包中的一個控件,可以和V4包中的ViewPager搭配產(chǎn)生一個聯(lián)動的效果。接下來通過本文給大家分享TabLayout自定義選擇背景滑塊的實例代碼,感興趣的朋友一起學習吧2016-10-10