一只大二狗的Android历程--国际化(作业)

    xiaoxiao2021-03-25  98

    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或者是亚马逊市场的话可以考虑一下

    转载请注明原文地址: https://ju.6miu.com/read-21116.html

    最新回复(0)