美文网首页
Android应用内切换语言

Android应用内切换语言

作者: leilifengxingmw | 来源:发表于2018-06-05 21:34 被阅读365次

首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈。

最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先。实现了中文,英文,泰语的切换。测试机器 Nexus5(Android p),HUAWEI荣耀9青春版(8.0.0),XIAOMI mi 4LTE(6.0.1)。看下效果


language.gif

完整的例子在底部

实现步骤
首先需要新建对应语言环境下的资源文件


微信截图_20180605205842.png

对于Android7.0及以上版本

定义一个BaseActivity,重写attachBaseContext方法,在此方法里进行语言切换

public class BaseActivity extends AppCompatActivity {

    /**
     * 此方法先于 onCreate()方法执行
     * @param newBase
     */
    @Override
    protected void attachBaseContext(Context newBase) {
        //获取我们存储的语言环境 比如 "en","zh",等等
        String language = SpUtil.getInstance(App.getContext()).getString(SpUtil.LANGUAGE);
        //attach 对应语言环境下的context
        super.attachBaseContext(LanguageUtil.attachBaseContext(newBase, language));
    }

}

LanguageUtil中的attachBaseContext()方法

public static Context attachBaseContext(Context context, String language) {
        Log.d(TAG, "attachBaseContext: "+Build.VERSION.SDK_INT);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        } else {
            return context;
        }
    }

    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Resources resources = context.getResources();
        Locale locale = LanguageUtil.getLocaleByLanguage(language);

        Configuration configuration = resources.getConfiguration();
        configuration.setLocale(locale);
        configuration.setLocales(new LocaleList(locale));
        return context.createConfigurationContext(configuration);
    }

在attachBaseContext()方法中,我们判断一下,如果当前api大于24,那么就调用updateResources()方法更新context。

定义好BaseActivity以后,我们只需要让我们的Activity都继承这个基类即可。

对于Android7.0及以下版本

自定义Application并在AndroidManifest.xml文件中声明,在Application的onCreate()方法中,调用更换语言的方法即可。

public class App extends Application {

    private static Context context;
    private final String TAG = getClass().getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        /**
         * 对于7.0以下,需要在Application创建的时候进行语言切换
         */
        String language = SpUtil.getInstance(this).getString(SpUtil.LANGUAGE);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            LanguageUtil.changeAppLanguage(App.getContext(), language);
        }
    }

    public static Context getContext() {
        return context;
    }
}

微信截图_20180605211204.png

LanguageUtil中的changeAppLanguage方法

  /**
     * @param context
     * @param newLanguage 想要切换的语言类型 比如 "en" ,"zh"
     */
    @SuppressWarnings("deprecation")
    public static void changeAppLanguage(Context context, String newLanguage) {
        if (TextUtils.isEmpty(newLanguage)) {
            return;
        }
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        //获取想要切换的语言类型
        Locale locale = getLocaleByLanguage(newLanguage);
        configuration.setLocale(locale);
        // updateConfiguration
        DisplayMetrics dm = resources.getDisplayMetrics();
        resources.updateConfiguration(configuration, dm);
    }

经过上面的操作就可以在7.0以下实现应用内切换语言。

手动切换语言

定义一个ChangeLanguageActivity

public void onClick(View view) {
        String language = null;
        switch (view.getId()) {
            case R.id.btn_chinese:
                //切换为简体中文
                language = LanguageType.CHINESE.getLanguage();
                break;
            case R.id.btn_english:
                //切换为英语
                language = LanguageType.ENGLISH.getLanguage();
                break;
            case R.id.btn_thailand:
                //切换为泰语
                language = LanguageType.THAILAND.getLanguage();
                break;
            default:
                break;

        }
        changeLanguage(language);
    }

    /**
     * 如果是7.0以下,我们需要调用changeAppLanguage方法,
     * 如果是7.0及以上系统,直接把我们想要切换的语言类型保存在SharedPreferences中,然后重新启动MainActivity即可
     * @param language
     */
    private void changeLanguage(String language) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            LanguageUtil.changeAppLanguage(App.getContext(), language);
        }
        SpUtil.getInstance(this).putString(SpUtil.LANGUAGE, language);
        Intent intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
    }

如果是7.0以下,我们需要调用changeAppLanguage方法, 如果是7.0及以上系统,直接把我们想要切换的语言类型保存在SharedPreferences中,然后重新启动MainActivity即可。

如果控件尺寸固定,当切换语言的时候,文字长短发生变化如何解决?

可以使用google提供的新特性来解决。

Autosizing TextViews

完整的例子请移步
https://github.com/humanheima/InternationalizationDemo

参考链接:
1.https://www.jianshu.com/p/32ff13db1f0d#comment-24575608
2.http://www.cnblogs.com/travellife/p/Android-ying-yong-nei-duo-yu-yan-qie-huan.html
3.https://yanlu.me/android-7-0-app-language-switch/
4.https://github.com/captain-miao/MultiLanguagesSwitch
5.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview

相关文章

  • Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈。 最近接触到...

  • Android 应用内语言切换

    如果是做国际类APP,那么肯定会涉及到多国语言切换的问题。本文简单的实现语言的切换。 前提条件 基础类 直接复制粘...

  • Android应用内切换语言

    一、前言: 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先。实现了中文,英文,泰语的切换。...

  • Android应用实现语言切换

    语言切换需求 应用内切换语言,支持阿拉伯语(从右到左书写,即RTL语言支持) 语言切换是切换系统语言,不只本应用 ...

  • 应用内切换语言

    思路 主要就是利用runtime hook系统的方法,宏定义为NSLocalizedString(key, com...

  • Android 应用内多语言切换

    最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果...

  • android应用内多语言切换

    新年好啊,一些面向国际化的应用需要支持多语言,客户说要是增加一个语言切换的功能最好不过了,今天,它来了。 先看效果...

  • Android 应用内切换多国语言

    话不多说,先上个工具类: package com.adorone.util;import android.cont...

  • Android App 应用内多语言切换

    App用户根据自己的语言喜好,设置app语言。语言设置只针对本app,并在下次启动应用时保留前一次启动设置。 切换...

  • ios 应用内切换语言

    1.首先添加需要支持的语言,默认支持英文,再添加中文即可 2.创建文件 创建完成后,再勾选另外的语言,base暂时...

网友评论

      本文标题:Android应用内切换语言

      本文链接:https://www.haomeiwen.com/subject/disusftx.html