在Android中使用正确的姿势写一个string.xml
2016-09-25 23:14
531 查看
首先,本文用于记录Android中琐碎的string.xml声明。
不要复用
不要复用同一个string。
1.假如你在登陆和注册界面都用了一个Dialog来提示处理中,我们需要再string.xml中声明—R.string.loading.并把这个string应用到各自的Dialog中去。
版本发布之后产品经理说这样提示不太友好,登陆应该是“Sign in…”,注册才应该是“Sign up…”,这时候你就要再去声明一个string并且还需要在代码中做修改,所以一开始为什么不分开声明string呢。
2.如果你的应用国际化这时候你可能无法预知是该显示哪种语言,不一定那个国家或者地区就能用同一个词来显示同一个string的意思。
是吧,如果是英文两个意思相同的能用同一个词来表示,但是在中文下就是两个不同意思了。(ps: 原文中用的不知道是哪国的语言,我采用了中文替换)。
独立化
给不同的界面通过增加前缀使它们独立明了,什么意思呢?直接看例子。
这么做有下面几点好处:
1.通过增加前缀能让你一眼就看出这些strings是在哪个界面被使用。
2.更加明了的string.xml让你以后再国际化中容易一个界面一个界面翻译过去。
当然你也可以针对不同的界面通过声明不同的string.xml来区分strings也是一种可取的方式,比如说setting_strings.xml、profile_strings.xml。
格式化
通过Resources#getString(int id, Object… formatArgs).来格式化strings。
假设我们这么声明一个string,下面这段代码采用“+”来拼接字符串。
不提倡采用这种方式来拼接字符串,因为在其他语言中词语顺序可能有所不同,我们应该采用Resources#getString(int id, Object… formatArgs)这种方式。
这里同上采用中文跟英文的方式来做比较,因为原文那个国家字打不出来。
复数
使用Resources#getQuantityString (int id, int quantity)来处理复数。
因为在不同语言环境下复数的表现方式不一样,所以最好不要再代码中来标示:
正确的方式应该采用Resources#getQuantityString (int id, int quantity)来处理:
string高亮
使用html文本来使string高亮。
如果你想改变字符串中的某些string高亮处理TextView — ForegroundColorSpan并不是最好的解决方式因为高亮是采取索引但是在多语言的app上并不是安全的做法。最好的方法是在string.xml中声明一个采用html的font color标签来的string。
假设你有这么一个字符串“Discover and play games.”你想高亮
Discover和play两个词,你应该这么做:
原文来自:https://medium.com/google-developer-experts/android-strings-xml-things-to-remember-c155025bb8bb#.w685pg3tq
不要复用
不要复用同一个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.xml中使用占位符
- <ZT>Android中string.xml使用总结
- Android 资源文件string.xml 中数组的使用(可支持多语言)
- Android string.xml中使用html标签
- Android的string.xml中使用html与变量
- 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager2、其中小点的图片用一个selector来控制颜色,point.xml:现欢迎引导页面
- android 自定义属性的使用一、在res/values文件下定义一个attrs.xml文件,代码如下
- 在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)
- Android 线程的正确使用姿势
- 一个android中使用sax解析xml的例子
- Android中自定义属性的使用------res/values文件下定义一个attrs.xml
- Android string.xml中使用html标签
- JAVA字符串格式化-String.format()的使用 及 Android 中 string.xml 中 字符串格式转化
- Android中string.xml使用总结
- Android中string.xml使用总结
- 【android】strings.xml中要注意的一个小问题和使用strings.xml中的资源时要注意的小问题
- android如何使用DOM来解析XML+如果做一个表情的弹出框
- Android的string.xml中使用html与变量
- android之使用string.xml文件自动补全文字
- Android开发必知--使用View.setId的正确姿势