翻译自https://www.gsm-guard.net/regional-preferences-in-android-14/
【外部链接图片传输失败。源站可能有防盗链机制。建议保存图片直接上传(img-9YLBwPZs-1687502002096)(/Users/ellisonchan/Nutstore Files/ellison-wiki/docs/Article Output /original/locale/android14-base-locale.png)]
目录:
背景
获取区域偏好
2.1 获取温度单位
2.2 获取一周的第一天
2.3 获取每小时周期
2.4 获取日历类型
示例
结论
Android 14的设置新增了区域偏好设置界面,允许用户设置特定的区域习惯,包括:
本文基于 Android 14 Beta 2。
这个功能非常适合使用某种地域习俗但生活在异地的人。例如,一个在中国生活习惯了华氏温度单位的外国人希望天气和地图应用程序能够显示华氏单位。而不是系统默认的摄氏度单位。
使用此功能可以设置与系统语言不同的特定温度单位、一周的第一天和每小时周期的区域首选项。
具体信息可以在设置>系统>语言找到 您可以在中看到区域首选项的菜单项。
我们可以使用新的LocalePreferences
API 来获取以下偏好数据:
此 API 存在于 AndroidX 包中。如果要使用,需要集成androidx.core:core-ktx
的依赖。版本为1.12.0-alpha01
及以上。
所有版本的 core-ktx 都可以在以下链接找到:
依赖项{...实现"androidx.core:core:1.12.0-alpha04"
}
利用 LocalePreferences 提供的 getTemperatureUnit()
返回代表当前所选温度单位的 String 类型 :
还提供其他功能获取在指定区域的温度单位:
getTemperatureUnit(区域设置区域设置)
getTemperatureUnit(区域设置区域设置,布尔值解析)
TemperatureUnit
中的频繁出现的(如华氏华氏
)进行映射和比较。您可以在以下链接查看所有常量定义:
getFirstDayOfWeek()
返回一周的第一天 表示当前选择的 首选项:
获取指定区域一周第一天偏好的功能:
getFirstDayOfWeek(区域设置区域设置)
getFirstDayOfWeek(区域设置区域设置,布尔值解析)
可以与SDK提供的FirstDayOfWeek
类中的常量(如MONDAY、Monday)进行映射和比较。您可以在以下链接查看所有常量定义:
getHourCycle()
用于获取当前区域的小时周期偏好,具体包括以下字符串:
与
相同,以下函数可以获得指定区域的每小时周期偏好:
getHourCycle(区域设置区域设置)
getHourCycle(区域设置区域设置,布尔值解析)
可以使用HourCycle
类中包含的常量与上面的字符串进行比较。您可以在以下链接查看所有常量定义:
getCalendarType()
用于获取当前区域的日历类型偏好:
获取指定区域日历类型的函数:
getCalendarType(区域设置)
getCalendarType(语言环境区域设置,布尔值解析)
类似,CalendarType
类中的常量可用于与字符串进行比较。您可以在以下链接查看所有常量定义:
比较不同区域的偏好值的最简单方法是创建一个BroadcastReceiver
来侦听区域更改(来自Settings > 系统 > 语言 > 系统语言),通过LocalePreferences
API 打印新区域的首选项值。
类 LocaleReceiver : 广播接收器(){@RequiresApi(构建 .版本代码.提拉米苏)覆盖 有趣 接收(上下文:上下文,意图:意图){ val localePreferenceData = """getTemperatureUnit : ${区域设置首选项.获取温度单位()} getFirstDayOfWeek:${区域设置.getFirstDayOfWeek()}getHourCycle:${区域设置首选项。 getHourCycle()}getCalendarType:${区域设置首选项。getCalendarType() }""".修剪缩进( )日志.d("新区域设置首选项值", localePreferenceData)}
}
下一步是在AndroidManifest.xml
文件中声明上述LocaleReceiver
。
<清单xmlns:android=》http://www.gsm-guard.net/apk/res/android" ...<应用程序...><接收器android:名字=”。 LocaleReceiver"android:启用="true"android:已导出=" true"><意图过滤器><操作 android:名称=“android.intent.action.LOCALE_CHANGED”/>意图过滤器 >接收器 >...应用>
清单>
我们来看看两个不同地区(美国和荷兰)的偏好差异,都是英文的:
区域偏好 | 英语(美国) | 英语(荷兰) |
---|---|---|
温度单位 | 华氏 | celsius |
第一星期几 | 太阳 | 星期一 |
小时周期 | h12 | h23 |
日历类型 | 公历 | 公历 |
让我们回顾一下这些数据有用的案例:
温度单位
许多需要显示天气数据的应用程序通常提供设置温度单位的权限。那么这个默认的数据就可以来自于系统的“区域偏好”。该应用程序可以转换设置并显示特定的温度单位。
一周的第一天
同样,很多应用程序也会提供日期选择组件来设置日期。这时候你可能需要设置一周的第一天,即是从周日开始还是周一开始。能够从系统的“一周的第一天”首选项同步设置将为用户提供更好的体验。
每小时循环
一般来说,在某些应用上进行创建笔记、支付、查看快递信息等操作时,会显示执行时间。如果能够与系统的“小时周期”偏好一致,数据显示会更加准确。
从Android 14开始,“设置”将显示区域偏好设置界面,允许用户独立设置系统语言之外的区域偏好。开发者也可以使用相应的API来获取此偏好。
我们可以使用以下两个函数来获取温度单位首选项和一周的第一天首选项:
LocalePreferences.getTemperatureUnit()
LocalePreferences.getFirstDayOfWeek()
此外,我们还可以从当前区域获取 小时周期 和 日历类型 首选项。
LocalePreferences.getHourCycle()
LocalePreferences.getCalendarType()
但实际上,我不太相信Locale Preferences API 会很快得到广泛使用。原因是许多应用程序已经自行实现了区域和其他偏好配置,并且它们不依赖于操作系统版本。
话虽如此,还是有相当多的应用程序不提供区域偏好设置,而且官方API兼容性更强,可以为用户提供一致的设置体验,所以我相信这个API会逐渐变得更受欢迎将来。来。