创建语言包
我们可以使用一个很蹩脚的办法来实现:
以中文包为例
values
是默认values-zh-rCN
是简体中文values-zh-rTW
是繁体(台湾省)中文values-zh-rHK
是繁体(香港)中文
app/src/main/res
内创建相应的文件夹,然后在里面创建一个strings.xml
,里面可以这样写
<resources>
<string name="nav_home">主页</string>
<string name="nav_search">搜索</string>
<string name="nav_profile">个人资料</string>
<string name="nav_notifications">通知</string>
<string name="notifications_settings">通知设置</string>
<string name="change_username">修改用户名</string>
<string name="change_avatar">修改头像</string>
<string name="security_center">安全中心</string>
<string name="storage_settings">存储设置</string>
<string name="language_settings">语言设置</string>
<string name="logout">登出账号</string>
<string name="delete_account">删除账号</string>
<string name="feedback">反馈</string>
<string name="back_button_desc">返回</string>
</resources>
当然,你也可以参考(definitely 转载)Android10 默认语言 安卓更改语言设置的方法去创建语言包。
以系统为主导的“应用语言偏好设置”
对于,像我这样的懒人,就绝对会交给Android系统来处理这事,看下图
我相中了这个东西。
在 (安卓官方)本地化 - 应用语言偏好设置)中就有提到如何将我的APP使用这个东西。
由于我使用的是Java来开发,所以,以Groovy
为例
原文是这样说的
要开启此功能,请在模块级 build.gradle.kts
文件(如果您使用 Groovy
,则是 build.gradle
文件)的 androidResources {}
块中使用 generateLocaleConfig
设置。此功能默认关闭。
android {
androidResources {
generateLocaleConfig true
}
}
说人话就是,在你的app
中的build.gradle
文件内添加,这个东西,即
androidResources {
generateLocaleConfig true
}
接着,指定默认语言区域——在应用模块的 res
文件夹中,创建一个名为 resources.properties
的新文件,然后在 resources.properties
文件中,使用 unqualifiedResLocale
标签设置默认语言区域。
譬如:设置成简体中文
unqualifiedResLocale=zh-rCN
(偷偷说一嘴,其实,没有resources.properties
是会出现No resources.properties file found. See https://developer.android.com/r/studio-ui/build/automatic-per-app-languages
的,但具体真的可以实现默认语言区域吗?还是有待考究的)
然后,构建程序
最后,你就可以在 应用语言偏好设置 看到你的 APP 了
从你的应用调到“应用语言偏好设置”
这一步是最关键的,前面两步只是“I have a pen,I have an apple”,这一步是要实现“apple pen”了。
我们都知道,Android要实现Activity
跳转,就要使用Intent
,但是我们要考究的是“跳到哪,带上什么东西”。
ACTION_APPLICATION_DETAILS_SETTINGS
?这个是“应用的设置页面”,对了一点——应用设置内是有“应用语言偏好设置”这个东西,它叫“语言”,但是,每次变换语言要多做一步,就是点击“语言”。
那怎样才能实现一步到位,我们应当跳转到android.provider.Settings.ACTION_APP_LOCALE_SETTINGS
,这会之间把我们带到这个App的应用语言偏好设置界面。
还有一点,我们得告诉它我们要改的是内个App,这时,用到intent.setData(android.net.Uri.parse("package:" + requireContext().getPackageName()));
,告诉intent
我们要调的是这个App。
实现的代码是这样的,由于我习惯了Java,所以,以Java为例,如下
Intent intent = new Intent(android.provider.Settings.ACTION_APP_LOCALE_SETTINGS);
intent.setData(android.net.Uri.parse("package:" + requireContext().getPackageName()));
startActivity(intent);
通过这个代码就可以把我们带到对应App的应用语言偏好设置了。
在应用中获得选择的语言
mob64ca12d7c9ee的Android 怎么获取系统设置的应用语言只能精确到zh
、en
,不能精确到zh-Hant-HK
,而我的却可以
只要以下代码,就可以实现
LocaleList configLocales = getResources().getConfiguration().getLocales();
if (!configLocales.isEmpty()) {
Locale currentLocale = configLocales.get(0);
// Log.d("MainActivity", "当前资源语言: " + currentLocale.toLanguageTag());
}
与其相关的生命周期
总所周知,安卓活动的生命周期如下:
onCreate()
活动首次创建时调用,用于初始化基本组件(如布局、数据绑定)。此方法接收 Bundle 参数保存之前的状态(如配置变更后的恢复)。
onStart()
活动即将进入前台时调用,用户虽不可交互,但可见。常用于恢复界面资源或注册广播接收器。
onResume()
活动进入前台并可与用户交互时触发。适合启动动画、传感器监听或高频率更新UI的操作。
onPause()
活动失去焦点但仍部分可见时调用(如对话框弹出)。需在此保存临时数据或释放占用的资源(如相机)。
onStop()
活动完全不可见时执行。可进行重量级资源释放(如数据库连接)。若活动被销毁,后续会调用 onDestroy();若重新返回前台,则调用 onRestart()。
onRestart()
活动从停止状态重新启动时调用,介于 onStop() 和 onStart() 之间。
onDestroy()
活动被销毁前调用,可能是用户主动关闭或系统回收资源。需在此清理所有剩余资源,避免内存泄漏。
此时,如果跳转到“应用语言偏好设置”并修改语言,就会发生onPause() → onStop() → onDestroy()
参考文献