做了国际化后更改系统语言,dialog里的一些文字未改变

一般要做国际化只要有相应的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持有也会出现切换语言后不改变的问题

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值