为啥要写这个?

本来今天是要学习内存优化的,和一些内存泄漏的排查方法的,结果,意外的遇到了语言适配的这个东西,然后就把它记录下来和大家分享一下。所以,写这个是个意外。。。

1.Android资源的自动选择

在Android的资源文件夹中,我们经常会看到这些文件夹名:drawale-hdpi,drawale-mdpi, drawale-xhdpi,drawale-xxhdpi等等,相信大家对他们都不陌生,但是,还是要说一下,毕竟还有些同学像我一样是菜鸟,可能还不知道。Android在调用资源文件的时候会根据不同的屏幕分辨率,自动地在这些文件中去寻找最适应的图片资源并显示。注意,这里说的是自动,不是我们需要有任何操作,这个过程对程序员是完全透明的。

2. Android实现国际化

字符串国际化:只要在 res 文件夹下新建对应语言的 values 文件夹就好了, 如,英语环境下的,文件夹命名为:values-en

美国英文环境:values-en-rUS

大陆地区中文环境: values-zh-rCN

在 eclipse 和 Android studio下新建 Android 项目时,会在 res 目录下自动创建一个默认语言环境的文件夹 : values

当某一个资源没有在语言环境的对应的资源集合中找到时,就会使用 values 下的资源。

若某一个语言环境没有在项目中定义语言环境,那么也会使用 values 下的资源。

下面看效果,我的环境是Android Studio 1.3.2。

android 国际化适配drawable android 国际化插件_bc


看看效果不错吧,我用了中国和英国,而且每个资源文件前还都有个小国旗~一目了然!

3. 图片国际化

同理,图片资源也是可以国际化的,命名规则如下:
drawable-zh-hdpi
drawable-en-ldpi
drawable-en-rUS-mdpi
在XML中,需要使用到图片的地方:@drawable/*
在代码中使用:R.drawable.*
这里有个地方要说一下,当然不说也可以,但是为了彰显一下N13,我还是要说一下,哈哈。。。
虽然,在国际化的过程中,我们可能存在多个具有相同name不同资源,在资源文件R.java中,却只有一份,这是为什么呢 ?之前说过,因为这里的适配,对程序员是完全透明的,所以,在代码中,即使是中间生成的代码也不会显示出来,只有系统在运行时才会动态决定。例如上面的app_name,在R.java中只有一份,虽然我定义了中文和英文两份字符串资源:

public static final class string {
        public static final int abc_action_bar_home_description=0x7f060000;
        public static final int abc_action_bar_home_description_format=0x7f06000f;
        public static final int abc_action_bar_home_subtitle_description_format=0x7f060010;
        public static final int abc_action_bar_up_description=0x7f060001;
        public static final int abc_action_menu_overflow_description=0x7f060002;
        public static final int abc_action_mode_done=0x7f060003;
        public static final int abc_activity_chooser_view_see_all=0x7f060004;
        public static final int abc_activitychooserview_choose_application=0x7f060005;
        public static final int abc_search_hint=0x7f060011;
        public static final int abc_searchview_description_clear=0x7f060006;
        public static final int abc_searchview_description_query=0x7f060007;
        public static final int abc_searchview_description_search=0x7f060008;
        public static final int abc_searchview_description_submit=0x7f060009;
        public static final int abc_searchview_description_voice=0x7f06000a;
        public static final int abc_shareactionprovider_share_with=0x7f06000b;
        public static final int abc_shareactionprovider_share_with_application=0x7f06000c;
        public static final int abc_toolbar_collapse_description=0x7f060012;
        public static final int action_settings=0x7f060013;
        public static final int app_name=0x7f06000d;
        public static final int hello_world=0x7f06000e;
        public static final int status_bar_notification_info_overflow=0x7f060014;
    }

android多国语言文件夹文件汇总

android多国语言文件夹文件汇总如下:
中文(中国):values-zh-rCN
中文(台湾):values-zh-rTW
中文(香港):values-zh-rHK
英语(美国):values-en-rUS
英语(英国):values-en-rGB
英文(澳大利亚):values-en-rAU
英文(加拿大):values-en-rCA
英文(爱尔兰):values-en-rIE
英文(印度):values-en-rIN
英文(新西兰):values-en-rNZ
英文(新加坡):values-en-rSG
英文(南非):values-en-rZA

阿拉伯文(埃及):values-ar-rEG
阿拉伯文(以色列):values-ar-rIL
保加利亚文: values-bg-rBG
加泰罗尼亚文:values-ca-rES
捷克文:values-cs-rCZ
丹麦文:values-da-rDK
德文(奥地利):values-de-rAT
德文(瑞士):values-de-rCH
德文(德国):values-de-rDE
德文(列支敦士登):values-de-rLI
希腊文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美国):values-es-rUS
芬兰文(芬兰):values-fi-rFI
法文(比利时):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法国):values-fr-rFR
希伯来文:values-iw-rIL
印地文:values-hi-rIN
克罗里亚文:values-hr-rHR
匈牙利文:values-hu-rHU
印度尼西亚文:values-in-rID
意大利文(瑞士):values-it-rCH
意大利文(意大利):values-it-rIT
日文:values-ja-rJP
韩文:values-ko-rKR
立陶宛文:valueslt-rLT
拉脱维亚文:values-lv-rLV
挪威博克马尔文:values-nb-rNO
荷兰文(比利时):values-nl-BE
荷兰文(荷兰):values-nl-rNL
波兰文:values-pl-rPL
葡萄牙文(巴西):values-pt-rBR
葡萄牙文(葡萄牙):values-pt-rPT
罗马尼亚文:values-ro-rRO
俄文:values-ru-rRU
斯洛伐克文:values-sk-rSK
斯洛文尼亚文:values-sl-rSI
塞尔维亚文:values-sr-rRS
瑞典文:values-sv-rSE
泰文:values-th-rTH
塔加洛语:values-tl-rPH
土耳其文:values–r-rTR
乌克兰文:values-uk-rUA
越南文:values-vi-rVN

效果展示:

以启动App的快捷方式为例子,系统分别在不同的语言下,名字的显示。上面的图我们可以看到,app_name在中文中和英文中分别是”内存测试”,和”memoryTest”。
AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ndk.sminger.memorytest" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MemoryActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

当系统语言设置为英文时:

android 国际化适配drawable android 国际化插件_语言适配_02

当系统语言设置为中文时:

android 国际化适配drawable android 国际化插件_bc_03