Android 如何从onConfigurationChanged中判断是语言发生了变化

众所周知,当例如系统语言,横竖屏发生切换等Activitiy或Service中会回调onConfigurationChanged

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

但如果onConfigurationChanged回调时,我们是否可以知道到底是哪个配置发生了改变呢?是语言切换了?还是横竖屏发生变化了?还是屏幕尺寸发生变化了?哈哈!!!答案是可以的,今天开发中就碰到了这个问题,遂记录之。

方法也是很简单的,大致如下几个步骤:

1、记录一个当前的配置Configuration,我命名为mLastConfig;

2、当onConfigurationChanged回调,用newConfig和mLastConfig进行对比;

public class DemoService extends Service{

    private Configuration mLastConfig;

    
    @Override
    public void onCreate() {
        super.onCreate();
        mLastConfig = new Configuration(getResources().getConfiguration());
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if ((newConfig.diff(mLastConfig) & ActivityInfo.CONFIG_LOCALE) > 0) {
            //TODO 语言切换
        } else if((newConfig.diff(mLastConfig) & ActivityInfo.CONFIG_ORIENTATION) > 0){
            //TODO 横竖屏切换
        }
        mLastConfig = new Configuration(newConfig);

    }

}

通过Configuration#diff(Configuration delta)方法,会返回新旧值差异的int值,再通过位运算即可知道对应项是否变化。例如ActivityInfo.CONFIG_LOCALE=0x0004,若差异值第三位值为1,说明是CONFIG_LOCALE对应项发生了变化,即切换了语言。

ps:mLastConfig对象不能直接通过getResources().getConfiguration()赋值 ,需通过new Configuration(getResources().getConfiguration())的方式获取。否则当Configuration发生改变,mLastConfig也跟着改变。(不要问我怎么知道的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值