不要重用
比如在登錄和注冊界面的 loading 彈窗中,表示正在加載的文字
<string name="loading">正在加載中...</string>
雖然兩個地方使用的文字都是“正在加載中...”苟翻,但是不要引用同一個 R.string.loading
相寇,而是分開定義
<string name="sign_in_loading">正在加載中...</string>
<string name="sign_up_loading">正在加載中...</string>
因為如果將來需要改動,比如登錄和注冊頁面的 loading 彈窗的文字應(yīng)該不一樣,那么就需要創(chuàng)建兩個不同的 string.xml 定義赠幕,同時還需要改動兩個地方的代碼。而一開始就定義好了兩個不同的 string.xml 定義询筏,那么要改動的只有 string.xml 文件而已榕堰。工作量就小很多了。
因為軟件開發(fā)中嫌套,需求經(jīng)常變動逆屡,在一開始就做好規(guī)劃和冗余,將來的工作量就會小很多踱讨。
所有的文字定義都要寫到 string.xml 中去
前面也說了
因為軟件開發(fā)中魏蔗,需求經(jīng)常變動,在一開始就做好規(guī)劃和冗余痹筛,將來的工作量就會小很多莺治。
因為你不能保證廓鞠,現(xiàn)在做的 App 將來不會支持多語言環(huán)境。如果將來有支持多語言環(huán)境的需求谣旁,而文字定義又是寫死在代碼中的床佳,改動起來就會很麻煩也很枯燥。
而且將文字定義寫在 string.xml 中也有一個好處:改動的工作量很小榄审。不需要到 Java 文件中去尋找定義砌们,減少了工作量,心情也好了搁进,有更多的時間去做有意義的事怨绣。
分門別類
屬于同一個屏幕下的文字,使用前綴和注釋拷获,將他們分割開來篮撑,便于管理與修改
<!-- settings screen start -->
<string name="settings_log_out">Log Out</string>
<string name="settings_notification_policy">Notification Policy</string>
<string name="settings_contact_us">Contact Us</string>
<!-- settings screen end -->
<!-- profile screen start -->
<string name="profile_name">Name</string>
<string name="profile_email">Email</string>
<string name="profile_work">Work</string>
<string name="profile_birthday">Birthday</string>
<!-- profile screen end -->
格式化
不要在代碼中使用 +
來連接字符串。因為如果是其他語言的話匆瓜,字符鏈接的順序可能會發(fā)生變化赢笨。
這是英語的
<string name="login_welcome_back">%s - welcome back</string>
這是俄語的
如果還是像這樣使用 +
連接字符串的話
String username = "John Doe";
String result = username + getString(R.string.login_welcome_back);
就會造成錯誤。所以正確的寫法應(yīng)該是使用 Resources#getString(int id, Object… formatArgs)
String username = "John Doe";
String result = getString(R.string.login_welcome_back, username);
字體顏色
下圖這樣的效果驮吱,可以使用 ?ForegroundColorSpan 來做茧妒。但是在多語言的情況下就不好做了,因為不同的語言左冬,切割字符串時下標(biāo)不好確定桐筏。
但是,使用 string.xml 就能很方便的解決問題
<string name="text" formatted="false">
<![CDATA[
<font color=\'#28b5f5\'>Discover</font> and <font color=\'#28b5f5\'>play</font> game.
]]>
</string>
TextView textView = (TextView) findViewById(R.id.tv);
textView.setText(Html.fromHtml(getString(R.string.text)));