不可不知的 Android strings.xml 那些事
相信 strings.xml 已經是大家在 Android 開發中最熟悉的檔案之一了,但其實它也有很多需要注意的地方和一些小技巧,知道了這些可以讓你的 Android 應用更加規範易用,大家來看看吧。: )
不要複用
這一條可能很多人會有不同的意見,因為廣為流行的程式設計理念就在教導我們要複用程式碼,當然程式碼複用是很好的理念,可以讓程式更加簡潔。但也容易形成什麼都想複用的思維慣性,而這在某些場景下就可能會造成麻煩。
比如,想象下你在應用中的登入和註冊介面中都是用了相同的字串 – R.string.loading.
<string name="loading">Loading...</string>
之後如果產品需求變更,要分別使用不同的提示語,那就不得不新建立兩個 string 並在程式碼中配置它們。所以如果從一開始就為不同頁面分別配置,那需要做的就僅僅是修改下 strings.xml 檔案。
<string name="sign_in_loading">正在登入...</string> <string name="sign_up_loading">正在註冊...</string>
更容易忽略的一個原因是,如果你們的應用不想只是面對國內使用者,還要面對其他語系的使用者的話,有些語言可能會造成意想不到的問題。
因為一些語言同樣一個意思在不同的語境下,會用到不同的單詞,箇中滋味經歷過的自然會懂。
良好的檔案結構
<!-- 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 代表了會格式化的數值並在第二的位置,大家可以以此類推。
// Java 程式碼: Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); // 注意引數的順序。
複數名詞
不要像下面這樣在你的 Java 程式碼中處理單詞複數問題,因為不同的語言針對複數會有不同的語法規則。
<!-- 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。
可以自由決定各自情況下,使用什麼詞語(當然,在中文環境下可能用處並不大)。
並且 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.
谷歌官方建議,作為一個開發者至少應該給名詞提供 ‘one’ 和 ‘other’ 屬性。
文字高亮
大家可能知道用 ForegroundColorSpan 或 SpannableStringBuilder 能夠高亮一段文字中的某些內容,但這對於多語言應用來說可能並不是最好的方式,因為這兩個方法都要依靠待高亮文字的具體位置作為引數。如果應用需要支援的語言多了之後,這就會寫大量的 Java 程式碼,和頻繁計算待高亮內容位置。
這個時候就可以試試用 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 的用法遠沒有很多人想的那麼簡單,這裡也算是拋磚迎玉一下,如果大家想要了解更詳細的用法,可以參考官方文件。: )
相關文章
- Java 混淆那些事(六):Android 混淆的那些瑣事JavaAndroid
- Android打包的那些事Android
- Sublime Text:初學者不知道的那些事
- 【Bugly乾貨】關於 Android N 那些你不知道的事兒Android
- 你不知道的軟體測試那些事?
- Android Drawable的那些事兒Android
- 你所不知道的 EMC 開源的那些事
- 你所不知道的阿里開源那些事兒阿里
- SpringApplication你不知道的那些事!SpringAPP
- Android實現推送的那些事Android
- Android Q 相容那些事Android
- 那些教育直播系統開發,你不知道的事
- Android-MeasureSpec那些事Android
- 關於執行緒池,那些你還不知道的事執行緒
- javascript 從定義到執行,你不知道的那些事JavaScript
- Android你不可不關注的那些公眾號Android
- Android資源那些事兒(詳)Android
- 前端裡那些你不知道的事兒之 【window.onload】前端
- openGauss賬本資料庫,你不知道的那些事兒資料庫
- 區塊鏈的那些事,你知道和不知道的都在這裡!區塊鏈
- 19. 再說函式~那些不得不知道的事兒函式
- Android 音視訊採集那些事Android
- Android studio gradle 打包 那些事AndroidGradle
- 不可不知的 JVM 預熱JVM
- 不可不知的WPF動畫(Animation)動畫
- Synchronized的那些事synchronized
- webassembly 的那些事Web
- ViewPager的那些事Viewpager
- Android技術總監應該乾的那些事Android
- android那些事--屬性動畫04TypeEvaluator的使用Android動畫
- 關於Android訊息機制的那些事兒Android
- 不可不知的 MySQL 升級利器及 5.7 升級到 8.0 的注意事項MySql
- 阿里資料庫十年變遷,那些你不知道的二三事阿里資料庫
- Android 音視訊 遇上鎖屏那些事Android
- Android效能優化(六)之卡頓那些事Android優化
- Java不可不知的泛型使用Java泛型
- 不可不知的 7 個 JDK 命令JDK
- 不可不知的python模組–collectionsPython