2017年3月10日 1:27 PM
今天上安卓课,老师布置了一个任务,让程序实现国际化 什么是国际化呢,说白了就是开发出来的应用在不同语种的使用者可以无障碍的使用,也就是文字的替换 也许,你们一定觉得世界上这么多个国家这得写多少个语种的文件啊,其实不然,只用开发本土语种和英语就可以了
在res文件夹下新建几个value文件夹(这个根据情况,应用适配的语种有几个就新建几个),注意,这里的文件夹命名是有规律的
value-语言代码-r国家或地区代码 例如,中国, value-zh-rCN
然后在没个文件夹里新建一个string.xml,新建完成后你就会发现神奇的事情,原本的xml文件图标被替换成国家符号了
然后把需要相互替换的代码写进去(之后有示例) 最后在layout布局里的文本直接引用就可以了,譬如
android:text="@string/gesture"就是这么简单,我们需要做的工作只有这么多,更换文本的问题Android就替我们给办了,接下来需要讲几个注意的要点
这个应该很显而易见,如果你把某个属性里的文字内容直接给写死了,那么Android就不知道你这个是本土语种的文本还是选中国家地区的文本,会带来错误,所以所有文本都需要写在string.xml文件里
这个说的有点专业了,说白了就是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或者是亚马逊市场的话可以考虑一下
