Android應(yīng)用內(nèi)切換語言

首先扯點(diǎn)別的:這是第一次在簡書上寫東西,我突然明白為啥這么多人在簡書上寫東西了隔嫡,因?yàn)闆]有廣告啊涂屁,哈哈书在。

最近接觸到Android 應(yīng)用內(nèi)切換語言的問題,研究了兩天拆又,做個記錄先儒旬。實(shí)現(xiàn)了中文,英文帖族,泰語的切換栈源。測試機(jī)器 Nexus5(Android p),HUAWEI榮耀9青春版(8.0.0),XIAOMI mi 4LTE(6.0.1)竖般∩蹩眩看下效果


language.gif

完整的例子在底部

實(shí)現(xiàn)步驟
首先需要新建對應(yīng)語言環(huán)境下的資源文件


微信截圖_20180605205842.png

對于Android7.0及以上版本

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

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 對應(yīng)語言環(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()方法中,我們判斷一下艰亮,如果當(dāng)前api大于24闭翩,那么就調(diào)用updateResources()方法更新context。

定義好BaseActivity以后迄埃,我們只需要讓我們的Activity都繼承這個基類即可疗韵。

對于Android7.0及以下版本

自定義Application并在AndroidManifest.xml文件中聲明,在Application的onCreate()方法中,調(diào)用更換語言的方法即可侄非。

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)建的時候進(jìn)行語言切換
         */
        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);
    }

經(jīng)過上面的操作就可以在7.0以下實(shí)現(xiàn)應(yīng)用內(nèi)切換語言。

手動切換語言

定義一個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以下逞怨,我們需要調(diào)用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以下叠赦,我們需要調(diào)用changeAppLanguage方法驹马, 如果是7.0及以上系統(tǒng),直接把我們想要切換的語言類型保存在SharedPreferences中,然后重新啟動MainActivity即可眯搭。

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

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

Autosizing TextViews

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

參考鏈接:
1.http://www.reibang.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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笔时,一起剝皮案震驚了整個濱河市棍好,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌允耿,老刑警劉巖借笙,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異较锡,居然都是意外死亡业稼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蚂蕴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來低散,“玉大人,你說我怎么就攤上這事骡楼∪酆牛” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵鸟整,是天一觀的道長引镊。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么弟头? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任吩抓,我火速辦了婚禮,結(jié)果婚禮上亮瓷,老公的妹妹穿的比我還像新娘琴拧。我一直安慰自己,他們只是感情好嘱支,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布蚓胸。 她就那樣靜靜地躺著,像睡著了一般除师。 火紅的嫁衣襯著肌膚如雪沛膳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天汛聚,我揣著相機(jī)與錄音锹安,去河邊找鬼。 笑死倚舀,一個胖子當(dāng)著我的面吹牛叹哭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痕貌,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼风罩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舵稠?” 一聲冷哼從身側(cè)響起超升,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哺徊,沒想到半個月后室琢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡落追,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年盈滴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轿钠。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雹熬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谣膳,到底是詐尸還是另有隱情竿报,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布继谚,位于F島的核電站烈菌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芽世,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一挚赊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧济瓢,春花似錦荠割、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箕宙,卻和暖如春嚎朽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柬帕。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工哟忍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陷寝。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓锅很,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凤跑。 傳聞我的和親對象是個殘疾皇子爆安,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容