首页 - 信息 - Android 14 中的新增功能:区域偏好设置

Android 14 中的新增功能:区域偏好设置

2023-10-01 06:46

翻译自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)]

目录:

  1. 背景

  2. 获取区域偏好

    2.1 获取温度单位

    2.2 获取一周的第一天

    2.3 获取每小时周期

    2.4 获取日历类型

  3. 示例

  4. 结论

1。背景

Android 14的设置新增了区域偏好设置界面,允许用户设置特定的区域习惯,包括:

  • 温度单位
  • 一周的第一天

本文基于 Android 14 Beta 2。

这个功能非常适合使用某种地域习俗但生活在异地的人。例如,一个在中国生活习惯了华氏温度单位的外国人希望天气和地图应用程序能够显示华氏单位。而不是系统默认的摄氏度单位。

使用此功能可以设置与系统语言不同的特定温度单位、一周的第一天和每小时周期的区域首选项。

具体信息可以在设置>系统>语言找到 您可以在中看到区域首选项的菜单项。

2。获取区域偏好

我们可以使用新的LocalePreferences API 来获取以下偏好数据:

  • 温度单位
  • 一周的第一天
  • 小时周期
  • 日历类型

此 API 存在于 AndroidX 包中。如果要使用,需要集成androidx.core:core-ktx的依赖。版本为1.12.0-alpha01及以上。

所有版本的 core-ktx 都可以在以下链接找到:

  • https://www.gsm-guard.net/jetpack/androidx/releases/core?ref=www.gsm-guard.net
依赖项{...实现"androidx.core:core:1.12.0-alpha04"
}

2.1 获取温度单位

利用 LocalePreferences 提供的 getTemperatureUnit() 返回代表当前所选温度单位的 String 类型 :

  • “摄氏度”(°C)
  • “华氏”(°F)

还提供其他功能获取在指定区域的温度单位:

  • getTemperatureUnit(区域设置区域设置)
  • getTemperatureUnit(区域设置区域设置,布尔值解析)
得到温度单位的字符串后,还可以与SDK提供的温度单位类TemperatureUnit中的频繁出现的(如华氏华氏)进行映射和比较。您可以在以下链接查看所有常量定义:

  • https://www.gsm-guard.net/reference/androidx/core/text/util/LocalePreferences.TemperatureUnit?ref=www.gsm-guard.net

2.2 获取一周的第一天

getFirstDayOfWeek() 返回一周的第一天 表示当前选择的 首选项:

  • “太阳” - 星期日
  • “星期一” - 星期一
  • “星期二” - 星期二
  • “星期三” - 星期三
  • “星期四” - 星期四
  • “星期五” - 星期五
  • “sat” - 星期六

获取指定区域一周第一天偏好的功能:

  • getFirstDayOfWeek(区域设置区域设置)
  • getFirstDayOfWeek(区域设置区域设置,布尔值解析)

可以与SDK提供的FirstDayOfWeek类中的常量(如MONDAY、Monday)进行映射和比较。您可以在以下链接查看所有常量定义:

  • https://www.gsm-guard.net/reference/androidx/core/text/util/LocalePreferences.FirstDayOfWeek?ref=www.gsm-guard.net

2.3 获取每小时周期

getHourCycle()用于获取当前区域的小时周期偏好,具体包括以下字符串:

  • “h11” - 12 小时制 (0-11)
  • “h12” - 12 小时制 (1-12)
  • “h23” - 24 小时制 (0-23)
  • “h24 ” - 24小时制(1-24)

相同,以下函数可以获得指定区域的每小时周期偏好:

  • getHourCycle(区域设置区域设置)
  • getHourCycle(区域设置区域设置,布尔值解析)

可以使用HourCycle类中包含的常量与上面的字符串进行比较。您可以在以下链接查看所有常量定义:

  • https://www.gsm-guard.net/reference/androidx/core/text/util/LocalePreferences.HourCycle?ref=www.gsm-guard.net

2.4 获取日历类型

getCalendarType()用于获取当前区域的日历类型偏好:

  • “中国” - 中国历
  • “dangi” - Dangi 历(韩国历)
  • “公历” - 公历
  • “希伯来” - 希伯来历
  • “印度” - 印度国家历
  • “islamic” - 伊斯兰历
  • “islamic-civil” - 伊斯兰历(表格,民用纪元)
  • “islamic-rgsa” - 伊斯兰历(沙特阿拉伯,目击)
  • “islamic-tbla” ” - 伊斯兰历(表格、天文纪元)
  • “islamic-umalqura” - 伊斯兰历 (Umm al-Qura)
  • “波斯” - 波斯历

获取指定区域日历类型的函数:

  • getCalendarType(区域设置)

  • getCalendarType(语言环境区域设置,布尔值解析)

类似,CalendarType类中的常量可用于与字符串进行比较。您可以在以下链接查看所有常量定义:

  • https://www.gsm-guard.net/reference/androidx/core/text/util/LocalePreferences.CalendarType?ref=www.gsm-guard.net

3。示例

比较不同区域的偏好值的最简单方法是创建一个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
第一星期几太阳星期一
小时周期h12h23
日历类型公历公历

让我们回顾一下这些数据有用的案例:

温度单位

许多需要显示天气数据的应用程序通常提供设置温度单位的权限。那么这个默认的数据就可以来自于系统的“区域偏好”。该应用程序可以转换设置并显示特定的温度单位。

一周的第一天

同样,很多应用程序也会提供日期选择组件来设置日期。这时候你可能需要设置一周的第一天,即是从周日开始还是周一开始。能够从系统的“一周的第一天”首选项同步设置将为用户提供更好的体验。

每小时循环

一般来说,在某些应用上进行创建笔记、支付、查看快递信息等操作时,会显示执行时间。如果能够与系统的“小时周期”偏好一致,数据显示会更加准确。

4。结论

从Android 14开始,“设置”将显示区域偏好设置界面,允许用户独立设置系统语言之外的区域偏好。开发者也可以使用相应的API来获取此偏好。

我们可以使用以下两个函数来获取温度单位首选项和一周的第一天首选项:

  • LocalePreferences.getTemperatureUnit()
  • LocalePreferences.getFirstDayOfWeek()

此外,我们还可以从当前区域获取 小时周期 日历类型 首选项。

  • LocalePreferences.getHourCycle()
  • LocalePreferences.getCalendarType()

但实际上,我不太相信Locale Preferences API 会很快得到广泛使用。原因是许多应用程序已经自行实现了区域和其他偏好配置,并且它们不依赖于操作系统版本。

话虽如此,还是有相当多的应用程序不提供区域偏好设置,而且官方API兼容性更强,可以为用户提供一致的设置体验,所以我相信这个API会逐渐变得更受欢迎将来。来。

参考

  • https://www.gsm-guard.net/reference/kotlin/androidx/core/text/util/LocalePreferences