Android 多語言切換無需重啟APP的方式

簡述

當APP需要給提供多種語音供用戶使用的時候计寇,作為開發(fā)者的我們自然要涉及到多語言切換的開發(fā)颈嚼,希望我提供的方式能給需要的小伙伴們一點思路怜械,老規(guī)矩先上圖。

效果如下弄抬,可能看起來會比較卡(不知道為啥黑屏時間卡了好久茎辐,實際效果是一閃而過)


效果圖.gif

實現(xiàn)方式

這是最常運用的最普遍的方式,通過創(chuàng)建不同的value 語言文件夾下的的string.xml 掂恕,當更改時拖陆,切換使用對應的字符資源。
讓我們先來創(chuàng)建對應的字符資源文件夾懊亡。在main目錄下的res文件夾右鍵新建一個資源文件夾


操作截圖1.png

選中Locale,導入限定資源里


操作截圖2.png

此時會出現(xiàn)各種語言資源依啰,在此項目中,我將新增中文(zh)與英文(en)字符資源 (懶得找的小伙伴其實只要知道對應的語言文化代碼店枣,直接自己創(chuàng)建命名也可)


操作截圖3.png

建完之后的目錄:


操作截圖4.png

接著再導入本次要使用的EventBus,用于廣播通知(也可用Broadcast速警,這次主要是對于語言切換的實現(xiàn)叹誉,故不展開講)

implementation 'org.greenrobot:eventbus:3.0.0'

然后我們先來實現(xiàn)一個抽象基類:BaseActivity,讓其它Activity繼承其特性闷旧,寫一些共有方法桂对,便于我們維護何使用,這里是為了實現(xiàn)多語言切換時鸠匀,不用在每個Activity中實現(xiàn)切換語言通知時,界面重建與減少繁瑣的編寫EventBus 的訂閱與注銷

public abstract class BaseActivity extends AppCompatActivity {
    public final static String SWITCH_LANGUAGE = "Language";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setLanguage();
        EventBus.getDefault().register(this);
        setContentView(getViewResId());
        init();
    }

    protected void init() {

    }

    protected abstract int getViewResId();



    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();

    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(String msg) {
        switch (msg){
            case SWITCH_LANGUAGE:
                setLanguage();
                recreate();//刷新界面
                break;
        }

    }

    private void setLanguage() {
        Locale myLocale = new Locale(SPUtils.getLanguage(this));
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
    }


}

setLanguage()方法中設置了我們的地理語言環(huán)境逾柿,將我們設置Locale賦值給Configuration缀棍,設置為我們需要的語言環(huán)境,再調用 recreate()方法銷毀界面再重新創(chuàng)建机错,此方法只有在API>26以上版本才存在爬范。調用后新創(chuàng)建的活動的生命周期:onCreate->onStart->onResume
其中SPUtils 工具類是用來在關閉應用后,重新打開我們的APP時弱匪,記錄用戶設置的切換語言類型(它本質就是一個小型數(shù)據庫青瀑,隨著應用卸載而被銷毀)

public class SPUtils {
    public static void setLanguage(Context context, String language) {
        SharedPreferences.Editor editor = context.getSharedPreferences("Language", context.MODE_PRIVATE).edit();
        editor.putString("language", language);
        editor.commit();
    }

    public static String getLanguage(Context context) {
        SharedPreferences editor = context.getSharedPreferences("Language", context.MODE_PRIVATE);
        return editor.getString("language","zh");//默認中文
    }
}

回到我們的主界面來,在XML上直接使用我們在strings中定義的內容萧诫,復制strings到對values-en 與 values-zh斥难,自行修改中文與英文的的內容


目錄文件.png
zh\string.png
en\string.png

在XML上的使用是通過@string/name 方式設置

操作截圖5.png

在代碼中則是通過調用Resources 的getString 方法獲取對應資源文件的id來設置

getResources().getString(R.string.to_one)

現(xiàn)在我們通過跳轉ActivityOne(記得要繼承我們編寫的基類)界面,點擊按鈕切換語言帘饶,XML布局就不給出了

public class ActivityOne extends BaseActivity {

    @Override
    protected void init() {
        onClickEvent();
    }

    @Override
    protected int getViewResId() {
        return R.layout.activity_one;
    }

    private void onClickEvent() {
        findViewById(R.id.tv_chinese).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                SPUtils.setLanguage(ActivityOne.this, "zh");
                EventBus.getDefault().post(BaseActivity.SWITCH_LANGUAGE);
            }
        });

        findViewById(R.id.tv_english).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SPUtils.setLanguage(ActivityOne.this, "en");
                EventBus.getDefault().post(BaseActivity.SWITCH_LANGUAGE);
            }
        });
    }
}

至此哑诊,就實現(xiàn)了語言切換的功能,錄制圖已貼在最頂部及刻,當然切換方法還有其它方式镀裤,這里給出較為常用的一種,希望能給需要的小伙伴們一點啟發(fā)缴饭。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末暑劝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子颗搂,更是在濱河造成了極大的恐慌担猛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丢氢,死亡現(xiàn)場離奇詭異毁习,居然都是意外死亡,警方通過查閱死者的電腦和手機卖丸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門纺且,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稍浆,你說我怎么就攤上這事载碌〔轮觯” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵嫁艇,是天一觀的道長朗伶。 經常有香客問我,道長步咪,這世上最難降的妖魔是什么论皆? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮猾漫,結果婚禮上点晴,老公的妹妹穿的比我還像新娘。我一直安慰自己悯周,他們只是感情好粒督,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著禽翼,像睡著了一般屠橄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闰挡,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天锐墙,我揣著相機與錄音,去河邊找鬼长酗。 笑死贮匕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的花枫。 我是一名探鬼主播刻盐,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劳翰!你這毒婦竟也來了敦锌?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤佳簸,失蹤者是張志新(化名)和其女友劉穎乙墙,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體生均,經...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡听想,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了马胧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汉买。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佩脊,靈堂內的尸體忽然破棺而出蛙粘,到底是詐尸還是另有隱情垫卤,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布出牧,位于F島的核電站穴肘,受9級特大地震影響,放射性物質發(fā)生泄漏舔痕。R本人自食惡果不足惜评抚,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伯复。 院中可真熱鬧慨代,春花似錦、人聲如沸边翼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽组底。三九已至,卻和暖如春筐骇,著一層夾襖步出監(jiān)牢的瞬間债鸡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工铛纬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厌均,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓告唆,卻偏偏與公主長得像棺弊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子擒悬,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354