Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android autofill:未布局DispatchProviderAutoFillStructure()_Android_Android Logcat_Autofill_Android 8.0 Oreo - Fatal编程技术网

Android autofill:未布局DispatchProviderAutoFillStructure()

Android autofill:未布局DispatchProviderAutoFillStructure(),android,android-logcat,autofill,android-8.0-oreo,Android,Android Logcat,Autofill,Android 8.0 Oreo,我已将我的应用程序配置为支持Android Oreo和CompileSDK版本26。我还为我的电话号码输入字段设置了android:autofillHints=“phone”。当我点击字段时,我可以看到“自动填充”弹出。但是,当我点击“自动填充”时,“内容无法自动填充”toast出现,我在logcat中看到以下跟踪: RemoteFillService Not handling { when=-3ms what=3 target=com.android.internal.os.HandlerC

我已将我的应用程序配置为支持Android Oreo和CompileSDK版本26。我还为我的电话号码输入字段设置了
android:autofillHints=“phone”
。当我点击字段时,我可以看到“自动填充”弹出。但是,当我点击“自动填充”时,“内容无法自动填充”toast出现,我在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 emulator设置中,我可以选择“使用Google自动填充”。使用Android Studio的设计选项卡,我添加了一个“Phone”类型
EditText
,然后在XML元素中手动插入
Android:autofillhits=“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特性。

您的手机上是否有实现自动填充服务的应用程序?我使用“谷歌自动填充”服务进行了尝试,可以毫无问题地自动填充我的电话号码(使用运行SDK 26的emulator)。您将需要一个服务部件,以使自动填充正常工作。请参阅。

这很可能就是问题所在-正如

as service for ComponentInfo{com.google.android.gms/com.google.android.gms.autofill.service.AutofillService} is already destroyed

在某些特殊情况下,您需要 确保数据可供用户使用的附加步骤 要保存的自动填充框架。例如,一个活动可以呈现一个 使用标准文本视图进行布局,然后销毁布局和 将其替换为一个没有子视图的视图,例如GLSurfaceView

在这种情况下,原始布局中的数据对用户不可用 框架要使数据可用于框架,您应该 在替换前调用AutofillManager对象 原始布局

您需要在java代码中修复其中一些问题

添加并检查自动填充

您可能需要管理java中的一些设置:

有时,您可能需要强制执行自动填充请求以响应用户操作


我是Android框架工程师,负责Autofill框架项目,因此我将回答一些问题:

  • “内容不能自动填充”消息通常意味着自动填充服务不知道如何自动填充屏幕。当您向应用程序添加自动填充支持时,通常更容易使用您可以首先控制的自动填充服务,而不是像密码管理器这样的“真正”服务。如前一答复所述,我们提供了一个可用于此目的的
  • 当您长按文本字段并选择AUTOFILL时,实际上您正在“强制”另一个答复中提到的自动填充请求(即,在幕后,文本字段正在调用AutofillManager.requestAutofill())。如果自动填充服务知道如何自动填充屏幕,则不需要这样做,因为一旦您聚焦输入字段,自动填充建议将立即显示
  • 在本例中,您不需要设置importantForAutofill或调用AutofillManager.cancel()
因此,我的建议是首先尝试使用示例Autofill服务实现来测试您的应用程序。最有可能的情况是,在您第一次访问应用程序时,自动填充弹出窗口不会显示,因为该服务没有相关数据。但一旦你的应用程序触发保存UI(例如,在你手动输入电话号码和活动完成后)并点击保存,那么下次启动活动时,这些数据应该可用

希望有帮助


--Felipe

获取最新的操作系统映像。下载并安装了2017年9月21日针对我的Google Pixel XL设备提供的更新后,
autofill
运行良好。因此,只要有XML格式的android:AutoFillHitts=“phone”就足够了,启用自动填充功能不需要其他更改。

无法自动填充内容“-这是因为我不同意自动填充服务。因此,进入Oreo和更高版本的android设置,搜索“自动填充”。找到你的服务(我的是默认的谷歌),应该会有一个同意其服务的提示。将其关闭,如果未显示,则选择一个。之后,我可以使用自动填充

除了新添加的
android:autofillHints=“phone”
之外,XML或代码中没有什么特别之处。我会尽量找时间详细说明。然而,谷歌的自动填充功能在其目前的状态下似乎有点不成熟:第一:不,我没有给它250美元的奖金。第二:正如我在Google Plus帖子中所展示的,我目前甚至无法选择“使用Google自动填充”,因此我真的无法提供可验证的示例(因为我目前无法自己验证)。我可以在API 26 emulator上使用“使用Google自动填充”。基于这一点,我更新了这个问题,加入了一个XML元素。现在正在使用1.9.17更新:在我的Google Pixel XL设备今天的更新之后,
autofill
可以完美地工作(没有额外的代码更改)!感谢您提供有关使用emulator的提示。基于此,我可以更新我的问题。谢谢,我拍了第一张照片,但我还不能修复我的代码。我将继续。嗯,在将emulator更新到最新的8.0之后,autofill开始工作,没有任何额外的代码更改。我想知道是否真的设备很快也会有更新……我的应用程序在更新的Nexus 5X API 26 emulator上的工作方式有所不同,autofill在该模拟器上工作得非常完美(即使不用长时间按下)。OTOH,Google Nexus XL,一款带有测试版程序图像的真实设备,不为同一个应用程序提供自动填充功能,即使长时间按下也不行。测试版程序是否有更新(仿真器似乎也有更新)?更新:在我的Google Pixel XL设备今天更新后,
autofill
工作正常(没有额外的代码更改)@费利佩·勒梅,你能不能请他
public void eventHandler(View view) {
    AutofillManager afm = context.getSystemService(AutofillManager.class);
    if (afm != null) {
        afm.requestAutofill();
    }
}