2017年3月10日 1:27 PM
今天上安卓课,老师布置了一个任务,让程序实现国际化
什么是国际化呢,说白了就是开发出来的应用在不同语种的使用者可以无障碍的使用,也就是文字的替换
也许,你们一定觉得世界上这么多个国家这得写多少个语种的文件啊,其实不然,只用开发本土语种和英语就可以了
现在,讲一下国际化的原理和注意的要点
原理
在res文件夹下新建几个value文件夹(这个根据情况,应用适配的语种有几个就新建几个),注意,这里的文件夹命名是有规律的
value-语言代码-r国家或地区代码
例如,中国, value-zh-rCN
然后在没个文件夹里新建一个string.xml,新建完成后你就会发现神奇的事情,原本的xml文件图标被替换成国家符号了
然后把需要相互替换的代码写进去(之后有示例)
最后在layout布局里的文本直接引用就可以了,譬如
android:text="@string/gesture"
就是这么简单,我们需要做的工作只有这么多,更换文本的问题Android就替我们给办了,接下来需要讲几个注意的要点
要点
要做到国际化,layout里的文字不能够写死了
这个应该很显而易见,如果你把某个属性里的文字内容直接给写死了,那么Android就不知道你这个是本土语种的文本还是选中国家地区的文本,会带来错误,所以所有文本都需要写在string.xml文件里
一定要注意,value文件夹必须是res文件夹的直接子目录
这个说的有点专业了,说白了就是value文件夹必须在res文件夹下面
工程目录类型要注意
这个意思是说很多开发者喜欢用Android目录类型,这个目录清晰,简洁明了,但是缺点是,它过于简洁了,很多文件是直接显示不出来的,所以推荐在建工程时使用Project文件目录类型
这就是国际化的原理和注意的事项,现在通过我上课写的例子来解释一下(因为相同格局太多,中间用到了自定义样式减少代码量)
实例
先给看下效果图
效果图
A.当前处于英文环境
B.当前处于中文环境
代码
新建两个文件夹value-zh-rCN和value-en-rUS,分别新建string.xml,根据效果图我们知道加上appname我们一共需要9个文本需要处理
首先看 value-zh-rCN下的string.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">手机信息界面</string>
<string name="cloud">云通信</string>
<string name="bluetooth">蓝牙</string>
<string name="gesture">手势管理</string>
<string name="gps">GPS定位</string>
<string name="system_info">系统信息</string>
<string name="internet">网络</string>
<string name="language">语言设置</string>
<string name="setting_notify">通知栏设置</string>
</resources>
然后是value-en-rUS下的string.xml文件(一定要保证name与上面的string.xml文件相同)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Phone info</string>
<string name="cloud">Cloud</string>
<string name="bluetooth">BlueTooth</string>
<string name="gesture">Gesture</string>
<string name="gps">GPS</string>
<string name="system_info">System info</string>
<string name="internet">Internet</string>
<string name="language">Language</string>
<string name="setting_notify">Notify</string>
</resources>
接下来说一下样式文件,在做样式文件之前需要确定自己采用的布局是什么,然后做出规划,最后写成xml文件
根据效果图可以知道我们达成这样的布局有很多种方法,现在我要说的是以外层RelativeLayout,内层多个LinearLayout平行的复合布局
首先我们可以知道,这里的LinearLayout的width是需要match_parent的,height需要warp_content,每一层有两个子控件,水平置中放置,所以添加了两个属性 gravity:center 和 orientation:horizontal
接下来就是子控件的统一样式,这个用到的属性比较多,大家看代码自行了解吧
style.xml
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--这个是LinearLayout的样式-->
<style name="h_warp_content">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item>
<item name="android:orientation">horizontal</item>
</style>
<!--这个是子控件的样式-->
<style name="tv_style">
<item name="android:layout_margin">10dp</item>
<item name="android:layout_width">145dp</item>
<item name="android:layout_height">100dp</item>
<item name="android:gravity">center</item>
<item name="android:paddingTop">8dp</item>
<item name="android:paddingBottom">8dp</item>
<item name="android:drawablePadding">5dp</item>
<item name="android:background">@android:color/white</item>
</style>
</resources>
忘了说了,这个style.xml文件是放在value文件夹下面的,大多数的工程下面会有一个styles.xml的文件,大家需要删掉这个自带的,不然在MainActivity里会报错,R文件找不到定义
最后就是布局文件了
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.bz0209.international.MainActivity">
<LinearLayout
style="@style/h_warp_content"
android:id="@+id/first">
<TextView
style="@style/tv_style"
android:text="@string/bluetooth"
android:drawableTop="@drawable/bluetooth"
/>
<TextView
style="@style/tv_style"
android:text="@string/cloud"
android:drawableTop="@drawable/clound"/>
</LinearLayout>
<LinearLayout
android:id="@+id/sec"
style="@style/h_warp_content"
android:layout_below="@+id/first"
>
<TextView
style="@style/tv_style"
android:text="@string/gesture"
android:drawableTop="@drawable/gesture"
/>
<TextView
style="@style/tv_style"
android:text="@string/gps"
android:drawableTop="@drawable/gps"/>
</LinearLayout>
<LinearLayout
style="@style/h_warp_content"
android:id="@+id/thir"
android:layout_below="@+id/sec">
<TextView
style="@style/tv_style"
android:drawableTop="@drawable/info"
android:text="@string/system_info"/>
<TextView
style="@style/tv_style"
android:drawableTop="@drawable/internet"
android:text="@string/internet"
/>
</LinearLayout>
<LinearLayout
style="@style/h_warp_content"
android:id="@+id/fifth"
android:layout_below="@+id/thir">
<TextView
style="@style/tv_style"
android:drawableTop="@drawable/language"
android:text="@string/language"/>
<TextView
style="@style/tv_style"
android:drawableTop="@drawable/notifycation"
android:text="@string/setting_notify"/>
</LinearLayout>
</RelativeLayout>
可以看出代码量大大地减少了,而且文本部分全部从string.xml里抽取
另外需要注意的一点是,在写布局文件的时候会如图的错误,不用管它,继续做就好
好了,这就是今天的作业,国际化,其实这部分可以留到项目最后做,甚至可以不做,但如果是要上架Google或者是亚马逊市场的话可以考虑一下