Android 14 新功能:区域偏好 Regional Preferences

news2024/11/16 5:40:49

在这里插入图片描述

翻译自 https://alexzh.com/regional-preferences-in-android-14/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YLBwPZs-1687502002096)(/Users/ellisonchan/Nutstore Files/ellison-wiki/docs/文章输出/原创/locale/android14-base-locale.png)]

目录:

  1. 背景

  2. 获取区域偏好设置

    2.1 获取温度单位

    2.2 获取一周首日

    2.3 获取小时周期

    2.4 获取日历类型

  3. 示例

  4. 结语

1. 背景

Android 14 的 Settings 中新增了区域偏好的设置画面,让用户可以设置具体的区域习惯,包括:

  • 温度单位
  • 一周首日

本篇文章基于 Android 14 Beta 2。

这项特性很适合那些使用某区域习惯而居住的地方是另一套习惯的人群,比如习惯了温度单位为华氏的外国人居住在中国,他希望天气、地图 App 能展示华氏单位,而非系统默认的摄氏单位。

利用这项特性,可以设置区别于系统语言的特定温度单位、一周首日以及小时周期等区域偏好。

具体的,可以在 Settings > System > Languages 中可以看到 Regional Preferences 的菜单入口。

img

2. 获取区域偏好设置

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

  • 温度单位
  • 一周首日
  • 小时周期
  • 日历类型

这个 API 存在于 AndroidX 包中,想要使用的话,需要集成 androidx.core:core-ktx 的依赖,版本在 1.12.0-alpha01 及以上。

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

  • https://developer.android.com/jetpack/androidx/releases/core?ref=alexzh.com
dependencies {
    ...
    implementation "androidx.core:core:1.12.0-alpha04"
}

2.1 获取温度单位

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

  • “celsius” (°C)
  • “fahrenhe” (°F)

同时也提供了其他函数来获取指定区域的温度单位:

  • getTemperatureUnit(Locale locale)
  • getTemperatureUnit(Locale locale, boolean resolved)

拿到温度单位的字符串之后,还可以和 SDK 提供的温度单位 Class TemperatureUnit 中的常(比如华氏的 FAHRENHEIT)量进行 mapping、对比。下面的链接可以看到所有的常量定义:

  • https://developer.android.com/reference/androidx/core/text/util/LocalePreferences.TemperatureUnit?ref=alexzh.com

2.2 获取一周首日

getFirstDayOfWeek() 则返回代表当前选择的一周首日偏好:

  • “sun” - Sunday
  • “mon” - Monday
  • “tue” - Tuesday
  • “wed” - Wednesday
  • “thu” - Thursday
  • “fri” - Friday
  • “sat” - Saturday

获取指定区域的一周首日偏好的函数:

  • getFirstDayOfWeek(Locale locale)
  • getFirstDayOfWeek(Locale locale, boolean resolved)

可以和 SDK 提供的 FirstDayOfWeek class 中的常量(比如 MONDAY,周一)进行 mapping、对比。下面的链接可以看到所有的常量定义:

  • https://developer.android.com/reference/androidx/core/text/util/LocalePreferences.FirstDayOfWeek?ref=alexzh.com

2.3 获取小时周期

getHourCycle() 则用来获取当前区域的小时周期偏好,具体包括如下几种字符串:

  • “h11” - 12 Hour System (0-11)
  • “h12” - 12 Hour System (1-12)
  • “h23” - 24 Hour System (0-23)
  • “h24” - 24 Hour System (1-24)

一样的,如下函数可以获取指定区域的小时周期偏好:

  • getHourCycle(Locale locale)
  • getHourCycle(Locale locale, boolean resolved)

可以用 HourCycle class 包含的常量和上述字符串进行对比。下面的链接可以看到所有的常量定义:

  • https://developer.android.com/reference/androidx/core/text/util/LocalePreferences.HourCycle?ref=alexzh.com

2.4 获取日历类型

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

  • “chinese” - Chinese Calendar
  • “dangi” - Dangi Calendar (Korea Calendar)
  • “gregorian” - Gregorian Calendar
  • “hebrew” - Hebrew Calendar
  • “indian” - Indian National Calendar
  • “islamic” - Islamic Calendar
  • “islamic-civil” - Islamic Calendar (tabular, civil epoch)
  • “islamic-rgsa” - Islamic Calendar (Saudi Arabia, sighting)
  • “islamic-tbla” - Islamic Calendar (tabular, astronomical epoch)
  • “islamic-umalqura” - Islamic Calendar (Umm al-Qura)
  • “persian” - Persian Calendar

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

  • getCalendarType(Locale locale)

  • getCalendarType(Locale locale, boolean resolved)

相同的,CalendarType 类中的常量可以用来和字符串进行对比。下面的链接可以看到所有的常量定义:

  • https://developer.android.com/reference/androidx/core/text/util/LocalePreferences.CalendarType?ref=alexzh.com

3. 示例

比较不同区域偏好值的最简单办法是创建一个 BroadcastReceiver,当监听到区域变更(从 Settings > System > Languages > System Languages 中操作)的时候,通过 LocalePreferences API 来打印新区域的偏好值。

class LocaleReceiver : BroadcastReceiver() {
    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
    override fun onReceive(context: Context, intent: Intent) {
        val localePreferenceData = """
            getTemperatureUnit: ${LocalePreferences.getTemperatureUnit()}
            getFirstDayOfWeek: ${LocalePreferences.getFirstDayOfWeek()}
            getHourCycle: ${LocalePreferences.getHourCycle()}
            getCalendarType: ${LocalePreferences.getCalendarType()}
        """.trimIndent()

        Log.d("New locale prefs values", localePreferenceData)
    }
}

下一步是在 AndroidManifest.xml 文件里声明上述 LocaleReceiver

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...
    <application
    ...>
    <receiver
        android:name=".LocaleReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
        <action android:name="android.intent.action.LOCALE_CHANGED" />
        </intent-filter>
    </receiver>
        ...
    </application>
</manifest>    

来看一下同是英语,但在两个不同区域(美国和荷兰)上的偏好差异:

区域偏好English (United States)English (Netherlands)
Temperature Unitfahrenhecelsius
First Day of Weeksunmon
Hour Cycleh12h23
Calendar Typegregoriangregorian

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

温度单位

很多需要展示天气数据的 App 通常会提供设置温度单位的入口,那么这个默认数据可来源于系统的“区域偏好”。App 便可以进行设置的转换和展示特定的温度单位。

一周首日

相似的,很多 App 也会提供日期选择组件来设置日期,此刻可能需要设置一周首日,即从周日还是周一开始。如果能够从系统的“一周首日”偏好中同步设置,便能给用户提供更佳的体验。

小时周期

通常来讲,在一些 App 上执行创建笔记、支付、查阅快递信息等操作的时候,会展示执行的时间。如果能够能和系统的“小时周期”偏好保持一致,数据的展示将更加精准。

4. 结语

Android 14 开始,Settings 会展示区域偏好的设置界面,供用户在系统语言以外独立设置区域偏好,开发者还可以使用相应 API 来获取该偏好。

我们可以使用如下两个函数来获取温度单位偏好和一周首日偏好:

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

此外,我们还可以从当前区域获得小时周期日历类型偏好。

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

但其实,我不太相信 Locale Preferences API 很快能得到广泛使用,原因在于很多 App 早已自行实现了区域之类的偏好配置,而且也不依赖 OS 版本。

话虽如此,还是有相当部分的 App 并没有提供区域偏好的设置,而且官方的 API 兼容性更好、能够给用户提供一致的设置体验,那么相信在未来这个 API 肯定能渐渐普及开来。

参考

  • https://developer.android.com/reference/kotlin/androidx/core/text/util/LocalePreferences

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/682952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信管理系统太多?该如何选择

“您的手机号就是您的微信号吗&#xff1f;我可以加您微信&#xff0c;然后给您发送我们的产品资料和报价。” 毕竟微信是一个月活跃用户超过10亿的应用&#xff0c;成为企业员工&#xff0c;尤其是销售人员沟通联络的首要选择&#xff0c;即使有其他专用办公工具&#xff0c;…

idea中使用java断言——java笔记

在 Java 中&#xff0c;断言是一种用于检查代码中是否满足特定条件的机制。它可以用来确保程序在开发和测试阶段的正确性&#xff0c;并且可以在出现错误时提供有用的错误信息。 断言在 Java 中由关键字 assert 表示&#xff0c;其语法为&#xff1a; assert condition;或者 …

6.Java的JDBC编程

文章目录 &#x1f306;1. 数据库编程&#x1f306;&#x1f3ef;1.1数据库编程的必备条件&#x1f3ef;&#x1f3f0;1.2下载驱动包&#x1f3f0;⛺️1.3导入驱动包&#xff1a;⛺️&#x1f3ed;1.4编写JDBC代码&#x1f3ed;&#x1f5fc;1.4.1数据库插入操作(在idea中用Jav…

《Opencv3编程入门》学习笔记—第七章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第七章 图像变换 图像变换&#xff1a;即将一幅图像转变成图像数据的另一种表现形式。 一、基于OpenCV的边缘检测 OpenCV中边缘检测的各种算子和滤波器&#xff1a;Can…

【雕爷学编程】Arduino动手做(125)---WT588D语音模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Linux缓冲区续集——手撕fopen、fwrite、fflush、fclose等C库函数

目录 头文件&#xff1a; 接下来就是设计这四个函数&#xff1a;Mystdio.c 重点讲一讲_fflush函数的底层实现原理&#xff1a; 所以数据内容的经过如下&#xff1a; 总结&#xff1a; 执行——测试写好的这4个函数&#xff1a; 运行结果: 修改测试代码&#xff…

ASEMI快恢复二极管MUR80100PT功能和应用实用指南

编辑-Z MUR80100PT是一种高性能、超快恢复二极管&#xff0c;设计用于各种应用&#xff0c;包括电源、逆变器和电机控制系统。本文将提供一个全面的指南&#xff0c;以了解MUR80100PT的特点和应用&#xff0c;以及它在提高电子设备的效率和可靠性方面的重要性。 MUR80100PT的特…

使用vite创建vue3、react项目

一、使用vite需要的环境 node: 14.18 , 16 vite官网&#xff1a;https://cn.vitejs.dev/guide/ 如上图、官网上明确给出了提醒&#xff0c;要使用vite搭建项目&#xff0c;需要node版本在14.18 二、使用vite创建vue3项目 1. 使用命令启动vite创建项目 使用 NPM: $ npm cr…

开始使用Dotnetty高性能网络库进行网络通讯

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不是…

深度:激光和光纤诞生记

光子盒研究院出品 导读&#xff1a;20世纪50年代以来&#xff0c;科技领域掀起了一场光学革命&#xff0c;激光和光纤的诞生&#xff0c;带来了革命性突破。事实上&#xff0c;激光和光纤的诞生也是第一次量子革命的范畴&#xff0c;因为这些技术的发展是基于对量子规律的观测和…

Java集合之LinkedList详解

Java集合之LinkedList 一、LinkedList类的继承关系1. 基类功能说明1.1. Iterator&#xff1a;提供了一种方便、安全、高效的遍历方式。1.2. Collection&#xff1a;为了使ArrayList具有集合的基本特性和操作。1.3. Queue: LinkedList是一种队列&#xff08;Queue&#xff09;数…

I/O error on POST request for “...“ PKIX path building failed的解决办法

异常&#xff1a; 项目中需要用RestTemplate调三方接口&#xff0c;url是https开头加密的。postman可以调通&#xff0c;代码提示没有证书&#xff0c;具体如下&#xff1a; [ERROR][2023-06-25 10:41:16,574][com.peraglobal.restInterface.controller.PLMController]I/O err…

MySQL如何在Centos7环境安装:简易指南

目录 前言 一、卸载不要的环境 1.检查本地MySQL是否正在运行 2.停止正在运行的MySQL 二、检查系统安装包 三、卸载这些默认安装包 1.手动一个一个卸载 2.自动卸载全部 四、获取mysql官方yum源 五、安装mysql yum源&#xff0c;对比前后yum源 1.安装前 2.安装中 3.…

MySQL进阶SQL语句之函数运用

目录 1.select&#xff08;显示表格中一个或数个字段的所有数据记录&#xff09; 2.distinct&#xff08;不显示重复的数据记录&#xff09; 3.where&#xff08;有条件查询&#xff09; 4.and 、or&#xff08;且、或&#xff09; 5. in&#xff08;显示已知的值的数据记…

浅谈单线程和多线程的异同

前两天有个面试&#xff0c;面试官问了我一个单线程和多线程的问题&#xff0c;情境如下&#xff1a; 面试官&#xff1a;你对单线程和多线程有什么看法&#xff1f; 我&#xff1a; 面试官&#xff1a; 我&#xff1a; 面试官&#xff1a; 我 现在先让我们来了解一下进程…

WS协议—介绍及原理

举例来说&#xff0c;我们想了解今天的天气&#xff0c;只能是客户端向服务器发出请求&#xff0c;服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。 WebSocket 协议在2008年诞生&#xff0c;2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是&…

ms17_010(永恒之蓝)漏洞复现详细教程

如题&#xff0c;这是个漏洞复现的详细教程&#xff0c;本教程针对的系统是Windows7操作系统&#xff0c;其他系统请自行测试。 备注&#xff1a;教程会很详细&#xff0c;讲解会很明白&#xff0c;一文可以解决你的常见困难。 测试环境 kalilinux 192.168.1.109 &#xff08;…

Java设计模式之结构型-装饰器模式(UML类图+案例分析)

目录 一、基本概念 二、角色设计 三、代码实现 案例一 案例二 四、总结 一、基本概念 装饰器模式是指不必在改变原有的类和不使用继承的情况下&#xff0c;动态扩展一个对象的功能。 二、角色设计 角色描述抽象构件是一个接口或者抽象类&#xff0c;定义我们最核心的…

科技云报道:边缘计算步入“黄金年代”

科技云报道原创。 当前时点&#xff0c;AI大模型已经站在了从“玩具”向“工具”快速演化的关键迭代期。如何让大模型渗透进入各类垂直场景&#xff0c;如何更低成本的使用大模型&#xff0c;如何让更多场景与用户接触AI&#xff0c;成为了发展的下一个重点。 在AI向实际场景…

大数据应用——总结与反思

1.谈谈你对大数据行业的认识&#xff0c;目前对应的大数据岗位有哪些&#xff1f;每种岗位需要掌握哪些技能水平&#xff1f;目前自己的差距在哪里&#xff1f; &#xff08;1&#xff09;概述 对于大数据行业的认识&#xff0c;我的理解是&#xff0c;大数据是指海量数据&…