一般要做国际化只要有相应的sring文件就好,这样当更改完系统语言后,应用就会自动加载相应的string,如果没有就会加载默认的string,但是最近在项目里发现了一个奇怪的事就是一些dialog的string没有变,上网找了下资料但是都千篇一律有用信息比较少,后来经过多次调试确认了是context的问题,因为context里包含应用的一些信息,包括字体的大小,语音等,当系统语言被切换后,activity如果被消毁那么重新加载activity时context是重新加载过的,这是你使用getstring(r.string.ok)是没有问题的,可当你在dialog里你不能直接去getstring,这时你要是用外部activity传入的context也没有问题,但如果你使用了application里的context那就有问题了,因为当你切换语言activity被消毁了,但是application却没有被销毁所以他持有的context还是老的属性造成了这种情况,要解决这样的问题,一般来说我们注意传入的context就好,可是并不是所有的使用context的地方都能拿到activity的context,所以这种方法并不适用。因此我想到了另外的方法如果你的应用在切换语言后并没有什么特殊的要求你可以写个广播监听语言切换,在确定切换语言后杀死应用。这样在打开应用时就是重启后context就已经更新了。
public class LanguageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//关闭应用
System.exit(0);
}
}
如果你不能杀死应用那么最好的办法就是更新application里的context了。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//当系统语言切换时会这里会得到信息
Locale locale = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
locale = newConfig.getLocales().get(0);
}
//更新context
changeAppLanguage(this, locale);
}
public static void changeAppLanguage(Context context, Locale newConfig) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
// app locale
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(newConfig);
} else {
configuration.locale = newConfig;
}
// updateConfiguration
DisplayMetrics dm = resources.getDisplayMetrics();
resources.updateConfiguration(configuration, dm);
}
以上就是我解决这种问题的方法,如果getstring的到的字符串被static持有也会出现切换语言后不改变的问题