Android国际化切换语言之后,首次进入界面无效果

这个问题都遇到过了,不去看看 APP国际化、动态设置控件颜色(APP个性化) ,如何设置国际化以及APP个性化吗?

最近遇到一个问题,在这里记录一下:
就是开发中需要切换语言时,切换之后也就是更换 String文件,
需要重新加载页面才可以实现效果,
即 fininsh() - Intent()本界面即可,
这是最简单的,当然还有无需重新加载界面等方法,自行百度即可

以下才是本文章的精华。。。

当需要记录用户选择了什么语言,方便用户下次进入应用无需重新切换,直接使用以前选的语言时,通过 SharedPreferences 存储即可, 这时,当你进入应用发现,每次进入应用时,他都会按照手机系统设置的语言去显示,而不是按照存储的语言去显示。。。。

解决办法:

  1. 现在分为7.0之前和7.0之后,想要正确的使用请分版本处理
  2. 在选择切换语言时 在当前 Activity 进行一次语言切换操作,同时存储在 本地,然后 Activity 不要直接去继承 AppCompatActivity、Activity 先写一个 Base (就是写一个公共Activity父类,这样写也能减少项目的代码量)去继承 他们,并且在Base里面进行 本地语言的 查询,并去为 App设置语言,然后在写每一个 Activity 的时候 直接继承 Base,这样每次 进入 App 之后先在 Base 里面进行语言的查询与设置,然后在实现子类的方法,这样每次进入App的时候就会显示 存储的 语言了
  3. 以上方法还不行 在 Activity 里或者 2里面的base里 重写 attachBaseContext 方法,该方法会给你一个 Context, 我们拿这个 Context 去处理切换语言
    override fun attachBaseContext(newBase: Context?) {
        super.attachBaseContext(LanguageUtils.getAttachBaseContext(newBase))
    }

LanguageUtils

/**
 * 国际化切换语言*/
public class LanguageUtils {

    //繁体中文
    public static String TW = "TW";

    //简体中文
    public static String ZH = "ZH";

    //切换语言
    public static void changeLan(){
        //获取本地存储的语音
        String mL = SessionUtils.INSTANCE.getString(SessionUtils.USER_LAN,ZH);
        //判断后进行切换存储
        if (mL.equals(ZH)){
            SessionUtils.INSTANCE.commitString(SessionUtils.USER_LAN,TW);
        }else {
            SessionUtils.INSTANCE.commitString(SessionUtils.USER_LAN,ZH);
        }
        //这一步操作是跳到指定界面,并销毁其他界面
        //自己封装的方法,需要可留言
        ARouter.INSTANCE.dto(MainActivity.class);
    }

    //获取当前语言
    public static Context getAttachBaseContext(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context);
        } else {
            //7.0之前的更新语言资源方式
            changeResLanguage(context);
            return context;
        }

    }

    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context) {
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        configuration.setLocale(getLocale());
        return context.createConfigurationContext(configuration);
    }

    private static void changeResLanguage(Context context) {
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        configuration.setLocale(getLocale());
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    }

    private static Locale getLocale(){
        Locale mL = Locale.CHINESE;
        //获取存储的语音判断,从而设置不同的语音
        if (SessionUtils.INSTANCE.getString(SessionUtils.USER_LAN, "").equals(TW)){
            mL = Locale.TRADITIONAL_CHINESE;
        }
        return mL;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值