Android 实现 APP 可切换多语言
如果是单独给 app 加上国际化,其实很容易,创建对应的国家资源文件夹即可,如values-en
,values-pt
,app 会根据当前系统语言去使用对应语言资源文件,如果找不到,则使用 values 文件夹里的资源
但本文讲得是另外一种情况,就是 app 内置一个切换多语言的页面,可以给用户切换
步骤
1.添加服务声明
此步骤主要是让我们的 app 可记录当前应用语言,使用的 Service 是 android 系统给我们提供的
2.在 xml 文件夹增加文件 locale_config.xml
声明支持的几个语言
3.调用方法切换多语言
补充下其他方法:
一些坑点
1.上架谷歌市场无法切换语言
上架到谷歌市场,用户下载只会下载其系统语言包,会导致 app 内置的语言切换功能无效
原因是打包为 aab 的时候,gradle 的配置,默认是开启了语言分包设置,我们取消这个设置就可以解决此问题
gradle 配置如下
2.使用 StringUtil 导致语言切换功能失效
我使用到了Blankj/AndroidUtilCode里面的 StringUtil 获取数据,到时切换多语言后会存在问题
原因是里面 StringUtil 里面使用的是 application 而不是 Activity
最终还是更换为使用 Activity 对象来获取 string 文本(activity.getString(R.string.hello)
)
也看到了 issue 有人说到这个问题,说要是更新 application 的资源文件,但我测试的时候发现更新 application 的语言资源后,会触发应用闪屏的效果,然后就没有使用此方法
由于项目进度赶,就没去细究了
3.使用静态数据导致后续没有文本没有更新
因为页面有几个使用相同布局的样式,比如说常见的菜单项,我是这样的做法:
抽取出来的一个静态类来存储对应数据(图标,文本之类),之后写一个 xml 文件,页面则是使用 include 来引用多份相同样式的 item,最终在 Activity 里给这些 item 赋值
由于 item 比较少,又不想用 recyclerview,就是采用了上面的这个方法
但是如果涉及到多语言切换的话,就会导致没有数据及时更新
原因是更换语言后,是 Activity 进行的重新创建,但我们存储数据的类还是存在的,里面文本数据并没有更新,所以就是导致了这个问题
解决方法简单粗暴,就每次 Activity 的 onCreate 方法里创建对应的数据对象即可,这样,Activity 重建之后我们的文本数据就会重新调用activity.getString(R.string.hello)
获取了
文章转载自: Stars-one
评论