ToastUtils切換多語言無效

前言

公司項目的Toast統(tǒng)一用到com.blankj.utilcode.util.ToastUtils的工具類,由于公司項目是維護多語言的系宜,所以在應用內有切換多語言的入口,但是應用切換了多語言后发魄,應用的語言已經變了盹牧,但Toast提示的語言并沒有變,嘗試了用系統(tǒng)的Toast卻是可以改變多語言的励幼,但是項目很多地方用到了ToastUtils工具類汰寓,所以不能用系統(tǒng)的Toast來替換,所以就有了這篇探索文章了苹粟。

ToastUtils工具類的探索

這是一個大神編寫的工具了有滑,這個工具類的好處就是不用傳入context,可以在很多沒有context對象的地方調用嵌削,當然這個工具類也對系統(tǒng)的Toast做了很多的處理毛好,提供了各種功能。具體有什么功能大家可以查看這個工具類苛秕,我們現(xiàn)在回歸到我們的問題肌访,ToastUtils切換多語言無效。

ToastUtils在應用中可以很方便的調用艇劫,只需在代碼中寫上ToastUtils.showShort(R.string.bold_text);就可以了吼驶。

ToastUtils工具類的一些方法

但是為什么切換多語言就會沒效呢?

我們從這個類的源碼來分析探索一下


showShort方法,調用show方法傳入資源id和時間


show方法店煞,從傳入資源id拿到字符串蟹演,在調用重載的show方法
重載的show方法,根據傳入的字符串浅缸,時間和拿到應用的Context根據ToastFactoty工廠調用系統(tǒng)的Toast


根據反射獲取Application

從源碼中轨帜,我們可以知道ToastUtils不用傳入Context就可以Toast是因為工具類已經幫我們從反射中拿到了應用的Application,所以我們不用傳入Context就可以調用Toast了魄咕,這就是ToastUtils工具類的方便之處衩椒。

但是切換多語言時為什么就不會切換資源呢?

多語言切換的探索

Android7.0及之后版本,使用了LocaleList毛萌,Configuration中的語言設置可能獲取的不同苟弛,而是生效于各自的Context。

* 這會導致:Android7.0使用舊的方式阁将,有些Activity可能會顯示為手機的系統(tǒng)語言膏秫。

* Android7.0 優(yōu)化了對多語言的支持,廢棄了updateConfiguration()方法做盅,替代方法:createConfigurationContext(), 而返回的是Context缤削。

* 也就是語言需要植入到Context中,每個Context都植入一遍吹榴。


在繼承的Application類中覆寫這兩個方法亭敢,設置修改多語言
在繼承的BaseActivity類中覆寫這個方法修改activity的多語言


系統(tǒng)多語言的設置

我公司的應用是兼用到5.0以上的,所以修改多語言就跑到此方法context = context.createConfigurationContext(config);所以重啟activity時就能更新多語言图筹。但是我們的應用是沒有重新啟動的帅刀,所以Application是沒有更新的。從之前對ToastUtils的分析远剩,ToastUtils是拿到應用的Application當做Context的扣溺,所以ToastUtils對于切換多語言就沒效了。從這分析瓜晤,是Application沒有更新導致多語言沒效锥余,于是就拿系統(tǒng)的Toast傳入application當Context嘗試,果真也是無效的痢掠。

解決辦法

一.既然是Application沒有更新導致多語言無效哈恰,那我們就更新Application就可以了。但Application是應用一啟動就創(chuàng)建了志群,自始至終就是這個着绷,不會更新的,所以我們就得重啟應用锌云,殺掉這個進程來更新這個Application荠医。

1.?

Intent intent = new Intent(this, Object.class);

startActivity(intent);

System.exit(0);

finish();

2. 通過ActivityManager來重新啟動應用程序:

ActivityManager manager = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);

manager.restartPackage("com.example.test");

3. 通過flag來實現(xiàn):

private void restartApplication() {

??????? final Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());

??????? intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

??????? startActivity(intent);

}

4. 利用PendingIntent

Intent mStartActivity = new Intent(context, StartActivity.class);

int mPendingIntentId = 123456;

PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId,??? mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);

System.exit(0);

只有關閉進程才算真正的更新了Application,所以只有1.4是有效的,但是這個更新Application的方式體驗很不好桑涎,因為關閉進程到重啟會出現(xiàn)黑屏彬向。

二.從多語言的切換我們知道,切換多語言有兩種方法

1.context = context.createConfigurationContext(config);

2.resources.updateConfiguration(config, dm);

第二種方法Android7.0 優(yōu)化了對多語言的支持攻冷,廢棄了updateConfiguration()方法娃胆,替代方法:createConfigurationContext(), 而返回的是Context。也就是語言需要植入到Context中等曼,每個Context都植入一遍里烦。使用第二種方法會導致:Android7.0使用舊的方式凿蒜,有些Activity可能會顯示為手機的系統(tǒng)語言。

但是我們可以在更新多語言的時候把應用的application傳進來更新應用的application資源就可以了胁黑,而不需要替換application


更新application的多語言方法

ToastUtils切換多語言就可以了废封,應用的Application也更新了資源。這種方法效果比一的方法好丧蘸,對應用沒有什么影響漂洋。


總結

經過這次的bug的處理,讓我對源碼的學習更加深入力喷,學會如何分析問題刽漂,找到問題和解決問題。其中也學習了多語言的切換的弟孟,反射爽冕,應用重啟還有各個Context的不同,雖然理解的可能還不是很深入披蕉,但是萬丈高樓平地起颈畸,凡是都是從點滴積累的,以后繼續(xù)加油没讲!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末眯娱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子爬凑,更是在濱河造成了極大的恐慌徙缴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘁信,死亡現(xiàn)場離奇詭異于样,居然都是意外死亡,警方通過查閱死者的電腦和手機潘靖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門穿剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卦溢,你說我怎么就攤上這事糊余。” “怎么了单寂?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵贬芥,是天一觀的道長。 經常有香客問我宣决,道長蘸劈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任尊沸,我火速辦了婚禮威沫,結果婚禮上贤惯,老公的妹妹穿的比我還像新娘。我一直安慰自己壹甥,他們只是感情好救巷,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布壶熏。 她就那樣靜靜地躺著句柠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棒假。 梳的紋絲不亂的頭發(fā)上溯职,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音帽哑,去河邊找鬼谜酒。 笑死,一個胖子當著我的面吹牛妻枕,可吹牛的內容都是我干的僻族。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼屡谐,長吁一口氣:“原來是場噩夢啊……” “哼述么!你這毒婦竟也來了?” 一聲冷哼從身側響起愕掏,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤度秘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饵撑,有當地人在樹林里發(fā)現(xiàn)了一具尸體剑梳,經...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年滑潘,在試婚紗的時候發(fā)現(xiàn)自己被綠了垢乙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡语卤,死狀恐怖侨赡,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情粱侣,我是刑警寧澤羊壹,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站齐婴,受9級特大地震影響油猫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜柠偶,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一情妖、第九天 我趴在偏房一處隱蔽的房頂上張望睬关。 院中可真熱鬧,春花似錦毡证、人聲如沸电爹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐箩。三九已至,卻和暖如春恤煞,著一層夾襖步出監(jiān)牢的瞬間屎勘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工居扒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留概漱,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓喜喂,卻偏偏與公主長得像瓤摧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子玉吁,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容