不可不知的 Android strings.xml 那些事 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jpush
V2EX    Android

不可不知的 Android strings.xml 那些事

  •  
  •   jpush 2017-04-07 10:36:04 +08:00 11852 次点击
    这是一个创建于 3116 天前的主题,其中的信息可能已经有所发展或是发生改变。

    相信 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 > 来分别使字符串具有加粗斜体和<u>下划线</u>。

    其实 strings.xml 的用法远没有很多人想的那么简单,这里也算是抛砖迎玉一下,如果大家想要了解更详细的用法,可以参考官方文档。: )

    作者: Hevin - 极光( JPush 为极光团队账号,欢迎关注)

    原文:不可不知的 Android strings.xml 那些事

    知乎专栏:极光日报

    6 条回复    2017-04-24 11:21:03 +08:00
    vjnjc
        1
    vjnjc  
       2017-04-07 11:11:22 +08:00
    看起来还不错,不过今年估计还用不上多语言配置了。。
    jimbray
        2
    jimbray  
       2017-04-07 11:31:18 +08:00
    Quantity String 这个真没用过
    zgh8126
        3
    zgh8126  
       2017-04-07 13:56:15 +08:00
    'fromHtml(java.lang.String)' is deprecated
    boolean93
        4
    boolean93  
       2017-04-08 00:56:57 +08:00
    惊奇地发现手上的项目竟然这些都有用到
    jpush
        5
    jpush  
    OP
       2017-04-10 10:30:21 +08:00
    @boolean93 那很棒阿哈哈哈
    aev2ex
        6
    aev2ex  
       2017-04-24 11:21:03 +08:00
    收藏了,挺有用,有几个都没用过
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1386 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 17:03 PVG 01:03 LAX 10:03 JFK 13:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86