android 自定义locale,Android Locale填坑

在Android应用中,开发者遇到获取系统国家地区返回为空的问题。问题源于在启动时重置语言,导致app resource的Locale信息被覆盖。通过Resources.getSystem的getConfiguration方法可以获取正确的系统国家。在Android 8.0及以上版本,需要使用ConfigurationCompat.getLocales以避免NPE Crash,并注意将Locale转换为List。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近实际项目中,需要获取手机系统国家地区来做一些特殊逻辑。很简单嘛,Locale#getDefault#getCountryCode,ok完成。实际run起来后,发现结果竟然返回为空。

What a f**k, 什么鬼。系统API怎么会有这种错误,翻开了API文档和google也没有任何有用信息。仔细思索后觉还是自己的问题,我们app支持18种语言,在启动时会根据系统默认和用户设置来重置语言。仔细翻看这部分代码发现,果然是在切换语言时重新设置了app resource的Locale信息,并在构造Locale时没有填入countryCode。

再通过debug来验证自己的想法,果然Resource中的Locale和Locale#getDefault是一样的。

那么如何去获取到正确的系统国家呢? 一个方法是在设置语言时传入正确的countryCode,但这个也受限于如何判定正确的国家。此外在翻看Resources的api文档发现一个getSystem的静态方法。注释如下:

Return a global shared Resources object that provides access to only system resources (no application resources), and is not configured for the current screen (can not use dimension units, does not change based on orientation, etc).

我们知道android在启动app进程时,都是从zoyge进程中fork出来。其中为了节约资源,也会将系统的资源"copy"一份,这部分资源就可以通过Resources#getSystem来获取到。那么这里获取到的Locale就是系统中设置的信息。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值