Android多语言切换(兼容安卓9、10)

前言:Android应用的开发不可能仅仅针对某一个国家或者区域使用,因此APP必须支持多种语言,为了实现这个特性,Android给出了一个解决方案,在res文件夹下通过values+语言编码来实现多国语言的支持(中间採用连字符号-连接)比如:values-es代表英文,在网上看过不少关于多语言切换的文章,但都没有达到自己的效果。

解决问题:
1、可同时在应用进入选择和内部切换
2、解决高版本切换语言不生效问题
3、解决切换闪屏、白屏问题
4、重启应用语言设置数据持久化

效果:

1、在项目res目录下新建需要的语言配置文件
Android多语言切换(兼容安卓9、10)_第1张图片
Android多语言切换(兼容安卓9、10)_第2张图片
Android多语言切换(兼容安卓9、10)_第3张图片
Android多语言切换(兼容安卓9、10)_第4张图片
这里新建了3种语言文字,需要其他语种的自行添加

语种 简称
中文(中国) 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-zh-rHK
英文(新加坡) values-en-rNZ
英文(南非) 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-zh-rHK
塔加洛文 values-th-rTH
土耳其文 values–r-rTR
乌克兰文 values-uk-rUA
越南文 values-vi-rVN

2、测试文字:
中文简体:

首页
信息
系统
我的
安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。

中文繁体(4个标题换了因为简繁一致看不出效果):

首頁
細膩
曉曦
訂單
安卓是一種基於Linux內核(不包含GNU元件)的自由及開放原始程式碼的作業系統。主要使用於移動設備,如智慧手機和平板電腦,由Google公司和開放手機聯盟領導及開發。Android作業系統最初由Andy Rubin開發,主要支援手機。2005年8月由Google收購注資。2007年11月,Google與84家硬體製造商、軟體發展商及電信營運商組建開放手機聯盟共同研發改良Android系統。隨後Google以Apache開源許可證的授權方式,發佈了Android的原始程式碼。

英文:

Home page
information
system
my
Android is a free and open source operating system based on the Linux kernel (which does not include GNU components). Primarily used on mobile devices such as smartphones and tablets, it is led and developed by Google and the open handset alliance. The Android operating system was originally developed by Andy Rubin and mainly supports mobile phones. It was acquired by Google in August 2005. In November 2007, Google formed an open handset alliance with 84 hardware manufacturers, software developers and telecom operators to develop and improve Android. Then Google released the source code for Android under the Apache open source license.

3、LanguageUtil语言切换工具类:

/**
 * 功能描述:修改app内部的语言工具类
 */
public class LanguageUtil {

    /*语言类型:
     * 此处支持3种语言类型,更多可以自行添加。
     * */
    private static final String ENGLISH = "en";
    private static final String CHINESE = "ch";
    private static final String TRADITIONAL_CHINESE = "zh_rTW";

    private static HashMap languagesList = new HashMap(3) {{
        put(ENGLISH, Locale.ENGLISH);
        put(CHINESE, Locale.CHINESE);
        put(TRADITIONAL_CHINESE, Locale.TRADITIONAL_CHINESE);
    }};

    /**
     * 修改语言
     *
     * @param activity 上下文
     * @param language 例如修改为 英文传“en”,参考上文字符串常量
     * @param cls      要跳转的类(一般为入口类)
     */
    public static void changeAppLanguage(Activity activity, String language, Class cls) {
        Resources resources = activity.getResources();
        Configuration configuration = resources.getConfiguration();
        // app locale 默认简体中文
        Locale locale = getLocaleByLanguage(StringUtils.isEmpty(language) ? "zh" : language);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(locale);
        } else {
            configuration.locale = locale;
        }
        DisplayMetrics dm = resources.getDisplayMetrics();
        resources.updateConfiguration(configuration, dm);

        LogUtils.e("设置的语言:" + language);
        //finish();
        // 重启app
        Intent intent = new Intent(activity, cls);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        activity.startActivity(intent);
        //加载动画
        //activity.overridePendingTransition(R.anim.anim_right_in, R.anim.anim_left_out);
        //activity.overridePendingTransition(0, 0);
    }

    /**
     * 获取指定语言的locale信息,如果指定语言不存在
     * 返回本机语言,如果本机语言不是语言集合中的一种,返回英语
     */
    private static Locale getLocaleByLanguage(String language) {
        if (isContainsKeyLanguage(language)) {
            return languagesList.get(language);
        } else {
            Locale locale = Locale.getDefault();
            for (String key : languagesList.keySet()) {
                if (TextUtils.equals(languagesList.get(key).getLanguage(), locale.getLanguage())) {
                    return locale;
                }
            }
        }
        return Locale.ENGLISH;
    }

    /**
     * 如果此映射包含指定键的映射关系,则返回 true
     */
    private static boolean isContainsKeyLanguage(String language) {
        return languagesList.containsKey(language);
    }

}

4、使用方法(自行添加3个按钮):

@OnClick({R.id.language1, R.id.language2, R.id.language3})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.language1:
                //中文简体
                showSaveLanguage("zh");
                break;
            case R.id.language2:
                //中文繁体
                showSaveLanguage("zh_rTW");
                break;
            case R.id.language3:
                //英文
                showSaveLanguage("en");
                break;
        }
    }

    /**
     * 保存设置的语言
     */
    private void showSaveLanguage(String language){
        //设置的语言、重启的类一般为应用主入口(微信也是到首页)
        LanguageUtil.changeAppLanguage(this, language, MainActivity.class);
        //保存设置的语言
        SpUserUtils.putString(this, "language", language);
    }

5、SpUserUtils .class存储类

public class SpUserUtils {
    
    private static SharedPreferences sp;

    private static SharedPreferences getSp(Context context) {
        if (sp == null) {
            sp = context.getSharedPreferences("SpUtil", Context.MODE_PRIVATE);
        }
        return sp;
    }

    /**
     * 存入字符串
     *
     * @param context 上下文
     * @param key     字符串的键
     * @param value   字符串的值
     */
    public static void putString(Context context, String key, String value) {
        SharedPreferences preferences = getSp(context);
        //存入数据
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

    /**
     * 获取字符串
     *
     * @param context 上下文
     * @param key     字符串的键
     * @return 得到的字符串
     */
    public static String getString(Context context, String key) {
        SharedPreferences preferences = getSp(context);
        return preferences.getString(key, "");
    }

    /**
     * 清除String
     * @param context
     * @param key
     */
    public static void clearString(Context context, String key) {
        SharedPreferences sp = getSp(context);
        SharedPreferences.Editor editor = sp.edit();
        editor.remove(key);
        editor.apply();
//        editor.clear();
//        editor.commit();
    }
}

6、解决应用重启后数据持久化问题:

/**
 * 引导界面
 */
public class WelcomeActivity extends AppCompatActivity {

    //防止重复打开界面
    private static boolean ISFIRST = true;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);

        String language = SpUserUtils.getString(this, "language");
        if (ISFIRST) {
            ISFIRST = false;
            LanguageUtil.changeAppLanguage(this, language, WelcomeActivity.class);
        }
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

7、优化白屏问题:


  
    

你可能感兴趣的:(安卓开发,android,多语言切换,高版本)