不可不知的Android strings.xml那些事
strings.xml有很多需要注意的地方和一些小技巧,知道了这些可以让你的Android应用更加规范易用,感兴趣的小伙伴们可以参考一下
不要复用
这一条可能很多人会有不同的意见,因为广为流行的编程理念就在教导我们要复用代码,当然代码复用是很好的理念,可以让程序更加简洁。但也容易形成什么都想复用的思维惯性,而这在某些场景下就可能会造成麻烦。
比如,想象下你在应用中的登录和注册界面中都是用了相同的字符串–R.string.loading.
<stringname="loading">Loading...</string>
之后如果产品需求变更,要分别使用不同的提示语,那就不得不新创建两个string并在代码中配置它们。所以如果从一开始就为不同页面分别配置,那需要做的就仅仅是修改下strings.xml文件。
<stringname="sign_in_loading">正在登录...</string>
<stringname="sign_up_loading">正在注册...</string>
更容易忽略的一个原因是,如果你们的应用不想只是面对国内用户,还要面对其他语系的用户的话,有些语言可能会造成意想不到的问题。
因为一些语言同样一个意思在不同的语境下,会用到不同的单词,个中滋味经历过的自然会懂。
良好的文件结构
<!--registerstart--> <stringname="register_username">用户名</string> <stringname="register_password">密码</string> <!--registerend--> <!--loginstart--> <stringname="login_username">用户名</string> <stringname="login_password">密码</string> <!--loginend-->
千万不要对此觉得麻烦,使用这样的方式来组织strings.xml文件,在应用变得复杂后,还能够很简单的通过搜索甚至观察的方式来找出你想要修改的字符串。
格式化
千万不要使用字符串拼接的方法,因为不同语言的句子顺序是多样的,字符串拼接会让你的逻辑非常复杂。
这个时候就可以考虑使用字符串格式化了:
<stringname="welcome_messages">Hello,%1$s!Youhave%2$dnewmessages.</string>
%1$s代表了会格式化的字符串,%2$d代表了会格式化的数值并在第二的位置,大家可以以此类推。
//Java代码: Resourcesres=getResources(); Stringtext=String.format(res.getString(R.string.welcome_messages),username,mailCount);//注意参数的顺序。 复数名词
不要像下面这样在你的Java代码中处理单词复数问题,因为不同的语言针对复数会有不同的语法规则。
<!--strings.xmlstart--> <stringname="book">book</string> <stringname="books">books</string> <!--strings.xmlend--> if(bookCount==0){ text=getString(R.string.book); }else{ text=getString(R.string.books); }
正确的做法应该是使用getQuantityString(intid,intquantity)方法。
<pluralsname="book"> <itemname="one">book</item> <itemname="others">books</item> </plurals> intbookCount=4; Resourcesres=getResources(); StringbookCount=res.getQuantityString(R.plurals.book,bookCount); //result:books.
当然QuantityString不仅支持one,还支持zero,two,few,many和other。
可以自由决定各自情况下,使用什么词语(当然,在中文环境下可能用处并不大)。
并且QuantityString也能和上面提到的格式化搭配使用:
<pluralsname="book"> <itemname="one">%dbookfound.</item> <itemname="others">%dbooksfound.</item> </plurals> intcount=4; Resourcesres=getResources(); StringbookCount=res.getQuantityString(R.plurals.book,count,count); //result:4booksfound.
谷歌官方建议,作为一个开发者至少应该给名词提供‘one'和‘other'属性。
文本高亮
大家可能知道用ForegroundColorSpan或SpannableStringBuilder能够高亮一段文本中的某些内容,但这对于多语言应用来说可能并不是最好的方式,因为这两个方法都要依靠待高亮文字的具体位置作为参数。如果应用需要支持的语言多了之后,这就会写大量的Java代码,和频繁计算待高亮内容位置。
这个时候就可以试试用HTML:
<stringname="html_text"formatted="false"> <![CDATA[ <fontcolor=\'#28b5f5\'>Hello</font>world. ]]> </string> TextViewtv=(TextView)findViewById(R.id.tv_txt); tv.setText(Html.fromHtml(getString(R.string.html_text)));
这其实也是格式化的一种,我们不仅能定义颜色,还可以使用<b>、<i>、<u>来分别使字符串具有加粗、斜体和下划线。
其实strings.xml的用法远没有很多人想的那么简单,这里也算是抛砖迎玉一下,如果大家想要了解更详细的用法,可以参考官方文档。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。