从 Android 11 开始,键盘和其他输入法编辑器 (IME) 可以内联显示自动填充建议,以建议栏或类似方式显示,而不是系统在菜单中显示建议。由于这些自动填充建议可能包含私人数据,例如密码或信用卡信息,因此在用户选择建议之前,这些建议对 IME 隐藏。更新 IME 和自动填充服务(例如密码管理器)以使用此功能。如果 IME 或自动填充服务不支持内联自动填充,则建议将显示在菜单中,如 Android 11 之前的版本。
工作流程
在此流程中,IME 指的是当前键盘或其他输入编辑器,建议提供程序指的是自动填充建议的相应提供程序。根据输入字段和用户的设置,建议提供程序可能是平台或自动填充服务。
用户将焦点放在触发自动填充的输入字段上,例如密码或信用卡输入字段。
平台查询当前 IME 和相应的建议提供程序,以查看它们是否支持内联自动填充。如果 IME 或建议提供程序不支持内联自动填充,则建议将显示在菜单中,就像 Android 10 及更低版本一样。
平台要求 IME 提供建议请求。此建议请求指定要显示的建议的最大数量,并为每个建议提供演示规范。演示规范指定最大尺寸、文本大小、颜色和字体数据等内容,让建议提供程序与 IME 的外观和风格相匹配。
平台要求建议提供程序提供最多请求数量的建议。每个建议都包含一个回调,用于填充包含建议 UI 的
View
。平台通知 IME 建议已准备好。IME 通过调用回调方法来填充每个建议的
View
,从而显示建议。为了保护用户的私人信息,IME 在此阶段不会看到建议的内容。如果用户选择其中一个建议,则会以与用户从系统菜单中选择建议相同的方式通知 IME。
以下部分介绍如何配置您的 IME 或自动填充服务以支持内联自动填充。
配置 IME 以支持内联自动填充
本部分介绍如何配置您的 IME 以支持内联自动填充。如果您的 IME 不支持内联自动填充,则平台默认会在菜单中显示自动填充建议。
您的 IME 必须将supportsInlinedSuggestions
属性设置为true
<input-method
xmlns:android="http://schemas.android.com/apk/res/android"
android:supportsInlineSuggestions="true"/>
当平台需要自动填充建议时,它会调用您的 IME 的InputMethodService.onCreateInlineSuggestionsRequest()
方法。您必须实现此方法。返回一个InlineSuggestionsRequest
,其中指定以下内容:
- 您的 IME 需要多少个建议。
每个建议的
InlinePresentationSpec
,定义建议必须如何呈现。
当平台有建议时,它会调用您的 IME 的 onInlineSuggestionsResponse()
方法,并传入包含建议的 InlineSuggestionsResponse
对象。您必须实现此方法。在您的实现中,调用 InlineSuggestionsResponse.getInlineSuggestions()
获取建议列表,然后通过调用其 InlineSuggestion.inflate()
方法来填充每个建议。
配置自动填充服务以支持内联自动填充
本节介绍如何配置您的自动填充服务以支持内联自动填充。如果您的应用不支持内联自动填充,则平台默认会在菜单中显示其自动填充建议。
您的自动填充服务必须 将 supportsInlinedSuggestions
属性设置为 true
<autofill-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:supportsInlineSuggestions="true"/>
当 IME 需要自动填充建议时,平台会调用您的自动填充服务的 onFillRequest()
方法,就像在 Android 11 以下版本中一样。但是,您的服务必须调用传递的 FillRequest
对象的 getInlineSuggestionsRequest()
方法来获取 IME 创建的 InlineSuggestionsRequest
。 InlineSuggestionsRequest
指定需要多少个内联建议以及每个建议必须如何呈现。如果 IME 不支持内联建议,则该方法返回 null
。
您的自动填充服务创建 InlinePresentation
对象,最多为 InlineSuggestionsRequest
中请求的最大数量。您的展示必须遵守 InlineSuggestionsRequest
指定的大小限制。要将您的建议返回给 IME,请为每个建议调用一次 Dataset.Builder.setValue()
。Android 11 提供了 Dataset.Builder.setValue()
的版本来支持内联建议。