原文: Android 实现APP可切换多语言 - Stars-One的杂货小窝

如果是单独给app加上国际化,其实很容易,创建对应的国家资源文件夹即可,如values-en,values-pt,app会根据当前系统语言去使用对应语言资源文件,如果找不到,则使用values文件夹里的资源

但本文讲得是另外一种情况,就是app内置一个切换多语言的页面,可以给用户切换

步骤

1.添加服务声明

此步骤主要是让我们的app可记录当前应用语言,使用的Service是android系统给我们提供的

<!--    国际化多语言    -->
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
<meta-data
android:name="autoStoreLocales"
android:value="true" />
</service>

2.在xml文件夹增加文件locale_config.xml

声明支持的几个语言

<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="en" />
<locale android:name="pt" />
<locale android:name="es" />
<locale android:name="de" />
<locale android:name="fr" />
</locale-config>

3.调用方法切换多语言

// 切换语言
val langua="en"
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(langua))

补充下其他方法:

//获取当前应用使用语言
val locale = AppCompatDelegate.getApplicationLocales()[0] //语言短标转为locale对象
val langua="en"
val locale = Locale.forLanguageTag(langua)

一些坑点

1.上架谷歌市场无法切换语言

上架到谷歌市场,用户下载只会下载其系统语言包,会导致app内置的语言切换功能无效

原因是打包为aab的时候,gradle的配置,默认是开启了语言分包设置,我们取消这个设置就可以解决此问题

gradle配置如下

buildTypes {
release { bundle{
//设置多语言不分包处理
language {
// Specifies that the app bundle should not support
// configuration APKs for language resources. These
// resources are instead packaged with each base and
// feature APK.
enableSplit = false
}
density {
// This property is set to true by default.
enableSplit = true
}
abi {
// This property is set to true by default.
enableSplit = true
} }
}
}

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)获取了

参考

Android 实现APP可切换多语言的更多相关文章

  1. App内切换语言

    前几天客户提需求,对App增加一个功能,这个功能目前市面上已经很常见,那就是应用内切换语言.啥意思,就是 英.中.法.德.日...语言随意切换. (本案例采用Data-Bingding模式,麻麻再也不 ...

  2. [Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络)

    [Android实例] app引导页(背景图片切换加各个页面动画效果)(申明:来源于网络) 地址: http://www.eoeandroid.com/thread-918356-1-1.html h ...

  3. APP定制开发:APP软件开发的语言和开发环境

    APP软件开发是移动互联网开发公司常开发的一种手机应用系统,对于刚刚进入APP软件开发领域的新手来说,选择什么编程语言和需要什么开发环境来开发APP软件是常遇到的问题.下面亿合科技小编来为大家分享下: ...

  4. android表白app

    一.前言 马上就要520和521了,是不是还有像我一样的单身狗啊.我就知道有,所以这两天简单写了这个小程序(其实是替别人写的),虽然我并不会用去骗女孩子(因为最近太忙了,实习完之后要搞毕设,要搞论文啊 ...

  5. 【Android端 APP GPU过度绘制】GPU过度绘制及优化

    一.Android端的卡顿 Android端APP在具体使用的过程中容易出现卡顿的情况,比如查看页面时出现一顿一顿的感受,切换tab之后响应很慢,或者具体滑动操作的时候也很慢. 二.卡顿的原因 卡顿的 ...

  6. android文件存储位置切换

    最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占 ...

  7. Android实现app长时间未操作时自动退出app

    这里要考虑3个问题,第一个是锁屏问题,第二个是app被切换至后台的问题,第三个是屏幕锁定和解除时app在后台时的问题 一,监听屏幕解锁,锁定 ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  8. Android——例子:屏幕切换

    效果图如下:                          Xml文件代码: <?xml version="1.0" encoding="utf-8" ...

  9. Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程

    最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...

  10. 实现了在android实现左右滑动切换界面的效果

    这是实现了在android实现左右滑动切换界面的效果,该效果的源码下载,请到源码天堂下载吧,喜欢的朋友可以研究一下. 布局文件 <?xml version="1.0" enc ...

随机推荐

  1. iptables基础

    简介 Linux防火墙主要工作在网络层,针对TCP/IP数据包实施过滤和限制.iptables是linux防火墙的管理程序,为包过滤机制的实现制定规则,并告诉内核空间的netfilter如何处理这些网 ...

  2. frp内网穿透环境搭建--服务端ubuntu 客户端win10

    前提条件:1个公网ip服务器,例如我的是腾讯云服务器ubuntu20 下载frp软件,下的是0.33.0版本,该版本直接把软件封装成服务,能用ubuntu直接定义开机自启等 github:https: ...

  3. 数据可视化【原创】vue+arcgis+threejs 实现流光边界线效果

    本文适合对vue,arcgis4.x,threejs,ES6较熟悉的人群食用. 效果图: 素材: 主要思路: 先用arcgis externalRenderers封装了一个ExternalRender ...

  4. 通过商品API接口获取到数据后的分析和应用

    一.如果你想要分析商品API接口获取到的数据,可以按照如下的步骤进行: 了解API接口返回值的格式,如JSON格式.XML格式.CSV格式等,选择适合你的数据分析方式. 使用API请求工具(如Post ...

  5. Hadoop NameNode启动后自动关闭解决方法

    Hadoop NameNode启动后过一会自动关闭了,查看日志文件报内存溢出异常: tail -100 /bigdata/logs/hadoop/hadoop-root-namenode-node1. ...

  6. 【RocketMQ】消息的拉取总结

    在上一讲中,介绍了消息的存储,生产者向Broker发送消息之后,数据会写入到CommitLog中,这一讲,就来看一下消费者是如何从Broker拉取消息的. RocketMQ消息的消费以组为单位,有两种 ...

  7. MySQL面试题——隔离级别相关面试题

    隔离级别相关面试题 MySQL事务隔离级别 未提交读--可以读到其他事务未提交的数据(最新的版本) 错误现象:脏读.不可重复读.幻读的现象 提交读(RC)--可以读到其他事务已提交的数据(最新已提交的 ...

  8. python实现简单的爬虫功能

    前言Python是一种广泛应用于爬虫的高级编程语言,它提供了许多强大的库和框架,可以轻松地创建自己的爬虫程序.在本文中,我们将介绍如何使用Python实现简单的爬虫功能,并提供相关的代码实例. 如何实 ...

  9. 使用SpringBoot开发一个POST接口

    SpringBoot项目的分层 SpringBoot框架项目一般分为五层: View层:向用户展示页面 Controller层:前后端交互层,接收前端请求,调用Service层中的方法,接收Servi ...

  10. CF1877 Div2 A-E 题解

    A 显然 \(n\) 个队的得分之和为 \(0\),因此答案为这 \(n-1\) 个数的和的相反数. 赛时代码 B 小贪心. 将所有人按 \(b\) 升序排序,\(b\) 相同时按 \(a\) 降序, ...