本文的翻译是专门为“ Android-developer”课程的学生准备的。 基础课程 。 “ 我们还提醒您,我们将继续注册高级课程“ Specialization Android-developer”
隐私和安全性可以在本文的第一部分中找到。
2)用户体验
a)导航手势

在Android Q中,Google尝试将所有导航手势与新的导航手势系统结合在一起,该系统取代了浮动导航栏(后退,首页和最新应用)。
- 影响因素:如果您的应用程序包含手势,则它们可能与系统手势冲突。 这将影响在Android Q上运行的所有应用程序(与目标SDK无关),因为将首先处理系统手势。
- 推荐方法:由于浮动导航栏实际上已消失,因此建议您充分利用可用的新屏幕空间,并为用户提供身临其境的效果。
要创建身临其境的效果,应用程序必须出现在状态栏和导航栏的后面。 首先,使状态栏和导航栏透明。
<style name="AppTheme"> ...... <item name="android:navigationBarColor">@android:color/transparent</item> <!-- Optional, but recommended for full edge-to-edge rendering --> <item name="android:statusbarColor">@android:color/transparent</item> </style>
接下来,使“
Activity/View
全屏显示:
view.systemUiVisibility =

FAB(浮动操作按钮)由浮动导航栏覆盖。 为了清楚起见,其中包含一个浮动导航栏。
现在,应用程序以全屏模式显示在(透明)系统组件的后面,系统UI可能阻止了某种交互式应用程序组件。 要解决此问题,请使用Insets。
插图是一组值,这些值将告诉我们将视图移动多少,以使它们不会与系统UI冲突。 此信息由
WindowInset类提供。 从API 20开始,Android为开发人员提供了System Window Insets,它告诉您系统组件(例如浮动导航栏和状态栏)所占用的空间。 此信息可用于移动交互式视图,以便用户在其上而不是在系统UI上进行点击。
root.setOnApplyWindowInsetsListener { _, insets -> val fabLp = fab.layoutParams as CoordinatorLayout.LayoutParams fabLp.bottomMargin = fabOriginalBottomMargin + insets.systemWindowInsetBottom fab.layoutParams = fabLp insets.consumeSystemWindowInsets() }
对于FAB,设置WindowsInsets侦听器,并将底部的窗口插图用作底部的缩进。
同样,从Android Q开始,系统提供了导航手势插图来移动滑动视图,以使其与系统手势不冲突。 通过Insets.getSystemGestureInsets()提供它们
系统手势区域以黄色突出显示。但是,如果我们不想移动视图并希望将某些内容放置在可能与应用程序冲突的手势区域中,该怎么办? 在这些情况下,应用程序可以确定应用程序将在其中首先处理触摸事件而不是系统手势的区域。 这可以通过将
List<
Rect >
传递给Android Q中提供的
View.setSystemGestureExclusionRects() API来完成
。ViewCompat中的
androidx.core:core:1.1.0
也可以使用此方法。
- 陷阱:您只能拒绝处理后向手势。 “主页”手势的边界已保留,无法重新定义。 这是因为只有一种退出应用程序的方法。 如果您的应用程序与“主页”手势冲突,请使用
WindowInsets.getMandatorySystemGestureInsets()
获取其边界并移动您的View。
b)黑暗主题
在过去的一年中,我们已经看到许多应用程序开始支持深色主题。 Android Q将此开关添加到系统设置中。
用户可以通过三种方式启用深色主题:
- 系统设置中的一个新项目(设置->显示->主题)
- 快速设置中的新项目
- 根据制造商的不同,可以通过省电模式将其打开。
为了支持Dark Theme的系统范围配置,应用程序的默认主题应继承自DayNight主题。 这将应用程序的主题与系统控制的夜间模式标志联系起来。 通过从
night
预选赛文件夹中提取资源来工作。
<!--App Compat Style--> <style name="AppTheme" parent="Theme.AppCompat.DayNight"> <!--Material Components--> <style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
如果查看App Compat样式,您将注意到DayNight主题在默认配置中指向AppCompat Light,在夜间配置中指向AppCompat。
<!--values/themes.xml--> <style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat.Light"> <!--values-night/themes.xml--> <style name="Theme.AppCompat.DayNight" parent="Theme.AppCompat">
如果要使用户能够从应用程序内部控制主题,可以调用
AppCompatDelegate.setDefaultNightMode() ,该方法接受以下四种模式之一:
MODE_NIGHT_YES
显示深色主题MODE_NIGHT_NO
显示一个明亮的话题MODE_NIGHT_FOLLOW_SYSTEM
遵循系统设置MODE_NIGHT_AUTO_BATTERY
当设备进入省电模式时, MODE_NIGHT_AUTO_BATTERY
深色主题。
a)不要对颜色进行硬编码。 如果布局文件中有硬编码的颜色,则这是一个唤醒呼叫。 将其替换为
color
链接。 更好的是:使用属性来引用颜色。
b)检查图像并为它们提供其他资源,作为
night
分类器的一部分。
c)矢量图中不得有硬涂层的颜色。 使用
tint
为矢量资源设置正确的颜色。
d)确保所有
color
资源在
night
文件夹中具有相应的替代方法(
values-night/colors.xml
)
e)如果应用程序将RemoteViews用于通知或小部件,请确保也对其进行测试。 如果应用程序使用默认的通知样式,则很好,因为这样系统将对其进行处理。
f)每当设备在正常和暗模式之间切换时,都会调用
uiMode
的配置更改。 用户可以手动执行此操作或激活省电模式。 如果应用程序无法正确处理配置更改,则当设备在正常和黑暗模式之间切换时,UI会丢失上下文,因为可见的活动及其片段会被破坏并重新创建。 因此,即使UI锁定在同一方向,也要添加对配置更改的支持。 另外,如果应用程序通过
android:configChanges
手动管理配置更改,则很有可能您还希望手动管理
uiMode
。 例如,如果应用程序使用连续播放(视频播放器),则可能不希望仅由于设备已在正常模式和暗模式之间切换而中断播放。
Android Q还引入了许多其他我没有详细讨论的内容,例如设置面板,新的AudioPlaybackCapture API(该API允许应用程序复制其他应用程序播放的声音。此功能类似于屏幕捕获,但用于音频)。
最后,Android Q包含受限的非SDK特定接口的更新列表,最终可能会拒绝从Android SDK进行访问。 您可以在播放控制台的“启动前报告”部分下找到违规列表。
仅此而已。 如果您觉得本文中没有提到重要事项,请在下面的评论中告诉我。 ;-)