5

我有一个显示用户名 UI 的活动,输入该用户名并点击继续按钮后会显示输入密码 UI。输入密码并点击登录按钮完成当前活动并启动新活动。在我的设备上,我选择了 Google 自动填充服务,所以在第一个活动完成后我想要“保存自动填充?” 对话框显示,但它不是。我通过在我的活动中添加 autofillHints 而没有其他任何内容来准备我的应用程序。我应该为弹出的对话框添加任何内容吗?

4

3 回答 3

1

我遇到了与您的情况类似的问题,请找到解决方案:

1-确保您添加了以下权限清单:

    <uses-permission
    android:name="android.permission.BIND_AUTOFILL_SERVICE"
    tools:ignore="ProtectedPermissions" />

2- 假设在您的登录屏幕中您有三个EditText(用户名、密码和验证码),因此您必须android:importantForAutofill为屏幕中的所有编辑文本添加。如果你错过了添加它(例如验证码,因为不需要保存它),不幸的是,自动填充对话框不会出现。

3-要保存用户名和密码,您应该为用户名editText和密码editText添加:

android:importantForAutofill="yes"

对于用户名editText,您应该添加:

 android:autofillHints="username"

对于密码editText,您应该添加:

 android:autofillHints="password"

注意:您不应textNoSuggestions将密码用于文本输入类型:

 android:inputType="textPassword|textNoSuggestions"

取而代之的是,您应该使用:

 android:inputType="textPassword"

4-您应该排除不需要的editText(Captcha)以免被保存,因此您应该添加到验证码editText:

 android:importantForAutofill="noExcludeDescendants"  

5-这是代码片段:

com.google.android.material.textfield.TextInputLayout
            android:id="@+id/usernameTextInputLayout"
            style="@style/TextInputStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/margin_16"
            android:layout_marginEnd="@dimen/margin_16"
            android:layout_marginBottom="@dimen/margin_16"
            app:endIconDrawable="@drawable/ic_username"
            app:endIconMode="custom"
            app:endIconTint="?attr/theme_primary">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/usernameEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:autofillHints="username"
                android:hint="@string/hint_username"
                android:imeOptions="actionNext"
                android:importantForAutofill="yes"
                android:inputType="text"
                android:maxLines="1"
                android:textAlignment="viewStart" />

        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/passwordTextInputLayout"
            style="@style/TextInputStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/margin_16"
            android:layout_marginEnd="@dimen/margin_16"
            android:layout_marginBottom="@dimen/margin_16"
            app:endIconDrawable="@drawable/ic_password"
            app:endIconMode="custom"
            app:endIconTint="?attr/theme_primary">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/passwordEditText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:autofillHints="password"
                android:hint="@string/hint_password"
                android:importantForAutofill="yes"
                android:inputType="textPassword"
                android:textAlignment="viewStart" />

        </com.google.android.material.textfield.TextInputLayout>

 <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/captchaTextInputLayout"
                style="@style/TextInputStyle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/margin_16"
                android:layout_marginEnd="@dimen/margin_16"
                android:layout_marginBottom="@dimen/margin_16"
                android:importantForAutofill="noExcludeDescendants"
                app:boxCornerRadiusTopEnd="0dp"
                app:boxCornerRadiusTopStart="0dp">

                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/captchaEditText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/hint_captcha_input"
                    android:imeOptions="actionNext"
                    android:importantForAutofill="noExcludeDescendants"
                    android:inputType="numberDecimal"
                    android:maxLength="@integer/otp_input_length"
                    android:maxLines="1"
                    android:textAlignment="viewStart" />

            </com.google.android.material.textfield.TextInputLayout>
于 2020-09-14T23:46:44.517 回答
1

尽管遵循文档并添加autofillHints到我的布局中,但我在模拟器上遇到了类似的行为,AutofillManager.commit()在使用 Google 自动填充服务时调用未触发保存 UI。

FWIW,我从模拟器切换到物理设备,即使我没有对我的实现进行任何更改,保存 UI 也开始正确触发。在这两种情况下,我都登录了 Google 帐户,并且在这两种情况下,Google 的示例调试自动填充服务都正确触发了保存 UI。

我注意到您说的是“设备”,所以这可能不适用于您,但如果您使用的是模拟器,那么在物理设备上进行测试可能值得一试,而且似乎没有其他解释说明为什么它不会不会出现。

于 2019-08-09T01:36:17.853 回答
0

确保在您设备的设置中也启用了 Google 自动填充功能: System > Language & Input > Autofill Service > Choose google.

根据设备的不同,它可能位于不同的嵌套设置页面中。

如果您想创建自定义自动填充,还请确保阅读 API 上的文档: https ://developer.android.com/guide/topics/text/autofill

于 2019-07-11T23:31:46.973 回答