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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值