您的位置:首页 > 移动开发 > Android开发

在Android中使用正确的姿势写一个string.xml

2016-09-25 23:14 531 查看
首先,本文用于记录Android中琐碎的string.xml声明。

不要复用

不要复用同一个string。

1.假如你在登陆和注册界面都用了一个Dialog来提示处理中,我们需要再string.xml中声明—R.string.loading.并把这个string应用到各自的Dialog中去。

<string name="loading">Loading please wait...</string>


版本发布之后产品经理说这样提示不太友好,登陆应该是“Sign in…”,注册才应该是“Sign up…”,这时候你就要再去声明一个string并且还需要在代码中做修改,所以一开始为什么不分开声明string呢。

<string name="sign_in_loading">Sign in...</string>
<string name="sign_up_loading">Sign up...</string>


2.如果你的应用国际化这时候你可能无法预知是该显示哪种语言,不一定那个国家或者地区就能用同一个词来显示同一个string的意思。

<string name="download_file_yes">Yes</string>
<string name="terms_of_user_yes">Yes</string>


<string name="download_file_yes">下载完成</string>
<string name="terms_of_user_yes">同意条款</string>


是吧,如果是英文两个意思相同的能用同一个词来表示,但是在中文下就是两个不同意思了。(ps: 原文中用的不知道是哪国的语言,我采用了中文替换)。

独立化

给不同的界面通过增加前缀使它们独立明了,什么意思呢?直接看例子。

<!--setting screen start-->
<string name="setting_log_out">Log Out</string>
<string name="setting_notification">Notification</string>
<string name="setting_contact_us">Contact Us</string>
<!--setting screen end-->


<!--profile screen start-->
<string name="profile_name">Name</string>
<string name="profile_email">Email</string>
<string name="profile_work">Work</string>
<!--profile screen end-->


这么做有下面几点好处:

1.通过增加前缀能让你一眼就看出这些strings是在哪个界面被使用。

2.更加明了的string.xml让你以后再国际化中容易一个界面一个界面翻译过去。

当然你也可以针对不同的界面通过声明不同的string.xml来区分strings也是一种可取的方式,比如说setting_strings.xml、profile_strings.xml。

格式化

通过Resources#getString(int id, Object… formatArgs).来格式化strings。

<string name="login_welcome_back"> - welcome back</string>


假设我们这么声明一个string,下面这段代码采用“+”来拼接字符串。

String username = "Jone Doe";
String result = username + getString(R.string.login_welcome_back);


不提倡采用这种方式来拼接字符串,因为在其他语言中词语顺序可能有所不同,我们应该采用Resources#getString(int id, Object… formatArgs)这种方式。

<string name="login_welcome_back">$s - welcome back</string>


<string name="login_welcome_back">欢迎 - $s 回来</string>


String username = "Jone Doe";
String result = getString(R.string.login_welcome_back, username);
//英文:Jone Doe - welcome back
//中文:欢迎 - Jone Doe 回来


这里同上采用中文跟英文的方式来做比较,因为原文那个国家字打不出来。

复数

使用Resources#getQuantityString (int id, int quantity)来处理复数。

因为在不同语言环境下复数的表现方式不一样,所以最好不要再代码中来标示:

<string name="minute">minute</string>
<string name="minutes">minutes</string>


String text;
int minute = Calendar.getInstance().get(Calendar.MINUTE);
if (minute == 0) {
text = getString(R.string.minute);
} else {
text = getString(R.string.minutes);
}


正确的方式应该采用Resources#getQuantityString (int id, int quantity)来处理:

<plurals name="minutes">
<item quantity="one">minute</item>
<item quantity="other">minutes</item>
</plurals>


int minutes = Calendar.getInstance().get(Calendar.MINUTE);
String text = getResources.getQuantityString(R.plurals.minutes, minutes);


string高亮

使用html文本来使string高亮。

如果你想改变字符串中的某些string高亮处理TextView — ForegroundColorSpan并不是最好的解决方式因为高亮是采取索引但是在多语言的app上并不是安全的做法。最好的方法是在string.xml中声明一个采用html的font color标签来的string。

假设你有这么一个字符串“Discover and play games.”你想高亮

Discover和play两个词,你应该这么做:

<string name="html_text" formatted="false">
<![CDATA[
<font color = \'#28b5f5\'>Discover</font>and<font color = \'#28b5f5\'>play</font>games.
]]>
</string>


TextView textView = (TextView) findViewById(R.id.textview);
text.setText(Html.fromHtml(R.string.html_text));


原文来自:https://medium.com/google-developer-experts/android-strings-xml-things-to-remember-c155025bb8bb#.w685pg3tq
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android string
相关文章推荐