getActivity / MultiLanguages

Android 多语种适配框架,兼容高版本,适配第三方库语种
Apache License 2.0
982 stars 123 forks source link

[疑惑]:android13 onConfigurationChanged问题 #37

Closed kanshenmekan closed 10 months ago

kanshenmekan commented 11 months ago

问题描述【必填】

我看库里面有注释
// 需要注意的是:Android 13 上面改变了系统的语种也不会回调 onConfigurationChanged 方法 // 所以就需要借助一些特殊手段来获取,通过查阅官方文档,发现没有什么好的办法监听到,只能通过轮询的方式

我使用demo,在android13的手机上面测试,去系统页面切换系统语言,是会调用这个方法的,包括横竖屏切换 232207601 只加了这个Log 3520230536

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

kanshenmekan commented 11 months ago

这个注释是其他含义吗,还是我理解错了,望解答,轮子哥

kanshenmekan commented 11 months ago

发现了问题,只要设置为不跟随系统,杀死app重新打开,然后去系统页面设置语言,都不会调用, 是否能考虑用Intent.ACTION_LOCALE_CHANGED,广播来监听系统语言变化

getActivity commented 11 months ago

MultiLanguages-9.2.aar.zip

getActivity commented 11 months ago

@kanshenmekan 小伙子,经过测试验证,用 Intent.ACTION_LOCALE_CHANGED 确实可以监听到系统语种的变化,目前该问题已经优化,你可以下载上面的 aar 包测试一下。

kanshenmekan commented 11 months ago

3916039550 android13 设置了setApplicationLocales之后,只有再次调用这个方法,设置其他Locale才会调用onConfigurationChanged 应该处理一下 1719981983 库里面是使用updateConfiguration实现的,不理解为什么要设置这个

getActivity commented 11 months ago

@kanshenmekan 小伙子,我没理解你说的《android13 设置了 setApplicationLocales 之后,只有再次调用这个方法,设置其他Locale 才会调用 onConfigurationChanged》 这句话的含义,希望能重新解释一下。

kanshenmekan commented 11 months ago

就是setApplicationLocales之后,只有改变这个值才会触发调用onConfigurationChanged,更改系统的语言没有效果,也不会触发onConfigurationChanged。 当设置setApplicationLocales一个空的LocaleList.getEmptyLocaleList(),就恢复跟随系统设置了,更改系统语言也会触发onConfigurationChanged

getActivity commented 11 months ago

小伙子,我测试了一下,就算没有调用 LocaleManager.setApplicationLocales,在 Android 13 的系统设置中,设置系统的语种或者单独设置应用的语种,都是可以触发 onConfigurationChanged 方法回调的,你测试一下看看是不是这样的?

kanshenmekan commented 11 months ago

LocaleManager.setApplicationLocales 没有调用默认就是EmptyLocaleList(),就是跟随系统语言,是可以触发onConfigurationChanged方法的,但是只要设置过一次LocaleManager.setApplicationLocales不为EmptyLocaleList,是一直保存的,杀死进程没用,需要卸载重装,就不会触发onConfigurationChanged方法

getActivity commented 11 months ago

MultiLanguages-9.2.aar.zip

getActivity commented 11 months ago

小伙子,测试了一下,情况如你所说的,目前该问题已经优化,你下载上面 aar 包试试看有没有问题?

kanshenmekan commented 11 months ago

我觉得用updateConfiguration 会有一个问题,只能实现app内切换语言,如果在xml 配置了android:localeConfig="@xml/locale_config" ,然后去Settings.ACTION_APP_LOCALE_SETTINGS会不会没效果,我没测试过

kanshenmekan commented 11 months ago

因为按照逻辑讲,应用语言页面设置了,会调用onConfigurationChanged,然后对比一下app内部设置的语言,不一样的话就改回app内部设置的语言了,会造成设置无效果

kanshenmekan commented 11 months ago

application 里面的onConfigurationChanged 是会改变attachBaseContext的context语种的

getActivity commented 11 months ago

我觉得用updateConfiguration 会有一个问题,只能实现app内切换语言,如果在xml 配置了android:localeConfig="@xml/locale_config" ,然后去Settings.ACTION_APP_LOCALE_SETTINGS会不会没效果,我没测试过

小伙子,我测试了,这样会触发 onConfigurationChanged 方法,间接触发 updateConfiguration 方法,这样的逻辑其实是不对的,要加上一个前置的条件,必须要指定某个语种的情况下,才去触发 updateConfiguration 方法。

kanshenmekan commented 11 months ago

那种情况试了没,首先app内部设置一个语言,不要跟随系统。然后去单个应用语言设置页面,选择一个不同的语言,看会不会生效

getActivity commented 11 months ago

小伙子,你知道在 Activity 上面调用 getSystemService(LocaleManager.class).setApplicationLocales 会是什么效果吗?

Ps:应用初始化的时候调用没事(不会闪屏),但是在 Activity 已创建的情况下调用就有问题(会出现闪屏)

getActivity commented 11 months ago

https://github.com/getActivity/MultiLanguages/assets/28616817/eca1fc43-113c-4efa-a14d-d860e7f385c8

getActivity commented 11 months ago

视频我放在上面了,你可以看一下,我的想法是不要让开发者适配 locales_config.xml,也不要在 App 设置中单独给应用设置语种,因为谷歌在 Android 13 把这个东西做得很烂,如果要达成你刚刚说的效果,那么用户在切换语种的时候,我必须要调用 getSystemService(LocaleManager.class).setApplicationLocales 方法,否则你从设置中的应用语种设置界面看到的还是旧的语种。

kanshenmekan commented 11 months ago

现在还会有一个问题,在app内部设置一个语言之后,然后在系统页面去设置单个app语言页面会没有效果。如果不要适配 locales_config.xml,可以不使用任何android13的api

getActivity commented 10 months ago

@kanshenmekan 是的,小伙子,只能这样做了

getActivity commented 10 months ago

@kanshenmekan 小伙子,框架的远程依赖更新了,你可以更新一下。

getActivity commented 10 months ago

后面框架使用有任何问题欢迎再反馈给我