我已将我的应用程序配置为通过compileSdkVersion 26支持Android Oreo。我还为我的电话号码输入字段设置了android:autofillHints="phone"。当我点击该字段时,可以看到“自动填充”弹出窗口。但是,当我点击“自动填充”时,会出现“无法自动填充内容”吐司,并且我在logcat中看到以下跟踪信息:

RemoteFillService  Not handling { when=-3ms what=3 target=com.android.internal.os.HandlerCaller$MyHandler } as service for ComponentInfo{com.google.android.gms/com.google.android.gms.autofill.service.AutofillService} is already destroyed
View               dispatchProvideAutofillStructure(): not laid out, ignoring

我该如何解决?我已确认我在“设置”>“系统”>“语言和输入法”>“高级”>“输入帮助”>“自动填充服务”中配置了电话号码。

使用示例XML进行更新:在API 26仿真器设置中,我可以选择“使用Google自动填充”。使用Android Studio的“设计”选项卡,我添加了“电话”类型EditText,然后在XML元素中手动插入了android:autofillHints="phone":
<EditText
    android:id="@+id/editText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="phone"
    android:autofillHints="phone" />

使用此XML可以观察到上述Logcat特性。

最佳答案

我是负责自动填充框架项目的Android框架工程师,因此我将回答一些问题:

  • “无法自动填充内容”消息通常表示自动填充服务不知道如何自动填充屏幕。当您向应用程序添加自动填充支持时,通常可以使用您可以首先控制的自动填充服务,而不是像密码管理器这样的“真实”服务。如上一个答复中所述,我们提供了一个sample service可以用于此目的。
  • 长按文本字段并选择AUTOFILL时,实际上是在“强制”另一个答复中提到的自动填充请求(即,在幕后该文本字段正在调用AutofillManager.requestAutofill())。如果自动填充服务知道如何自动填充屏幕,则无需这样做,因为一旦您关注输入字段,自动填充建议就会立即显示。
  • 在您的情况下,您无需设置ImportantForAutofill或调用AutofillManager.cancel()。

  • 因此,我的建议是尝试首先使用示例自动填充服务实现来测试您的应用程序。最有可能的是,第一次访问您的应用程序时,不会显示自动填充弹出窗口,因为该服务没有相应的数据。但是,一旦您的应用程序触发了保存UI(例如,在您手动输入电话号码并且 Activity 完成之后),然后点击“保存”,那么下次启动 Activity 时该数据应该可用。

    希望能有所帮助,

    -费利佩

    关于android - Android自动填充: dispatchProvideAutofillStructure() not laid out,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45627420/

    10-09 04:38