Android應用內切換語言

一、前言:

最近接觸到Android 應用內切換語言的問題,研究了兩天,做個記錄先。實現(xiàn)了中文,英文,泰語的切換。測試機器 Nexus5(Android p),HUAWEI榮耀9青春版(8.0.0),XIAOMI mi 4LTE(6.0.1)。
看下效果

3611193-43512ff261d36a99.gif

二、實現(xiàn)步驟

1、首先需要新建對應語言環(huán)境下的資源文件

圖片.png

2、對于Android7.0及以上版本

定義一個BaseActivity,重寫attachBaseContext方法,在此方法里進行語言切換

public class BaseActivity extends AppCompatActivity {

    /**
     * 此方法先于 onCreate()方法執(zhí)行
     * @param newBase
     */
    @Override
    protected void attachBaseContext(Context newBase) {
        //獲取我們存儲的語言環(huán)境 比如 "en","zh",等等
        String language = SpUtil.getInstance(App.getContext()).getString(SpUtil.LANGUAGE);
        //attach 對應語言環(huán)境下的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都繼承這個基類即可。

2、對于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創(chuàng)建的時候進行語言切換
         */
        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;
    }
}
圖片.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以下實現(xiàn)應用內切換語言。

3、手動切換語言

定義一個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及以上系統(tǒng),直接把我們想要切換的語言類型保存在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及以上系統(tǒng),直接把我們想要切換的語言類型保存在SharedPreferences中,然后重新啟動MainActivity即可。

4、字體變化

如果控件尺寸固定,當切換語言的時候,文字長短發(fā)生變化如何解決?

可以使用google提供的新特性來解決。

Autosizing TextViews

完整的例子請移步
https://gitee.com/lyyon/InternationDemo


參考鏈接:http://www.itdecent.cn/p/4f9db19d9383
1.http://www.itdecent.cn/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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容