美文网首页
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应用内切换语言

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