13

Android O的功能支持Auto-filling的字段。有什么办法可以禁用它为特定的应用程序。这是我想强制我的应用程序不使用自动填充服务。禁用应用程序的Android O自动填充服务

可能吗?

要阻止自动填充为整个活动中的onCreate活动的使用():

getWindow() 
    .getDecorView() 
    .setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS); 

有没有比这更好的方法?

+2

自动填充会导致崩溃,这是一个非常模糊的现象,当用户将焦点更改为TextInputLayout中以前填充的textInputEditText时发生:java.lang.NullPointerException:试图调用虚拟方法void android.view.View.getBoundsOnScreen在空对象引用 – Justin

+0

发射的错误https://issuetracker.google.com/issues/67675432(android.graphics.Rect)”,请明星是 –

+0

我找到了解决方法,请参阅我的答案!非常感谢您 – Karoly

回答

3

这可能吗?

不是我所知道的。当然,没有任何记录。

有没有比这更好的方法?

不是我所知道的。

+0

这是固定在Android 8.1上,你可以用8测试它。1 –

1

创建自定义EditText样式并将android:importantForAutofill设置为no

<style name="EditTextStyleWithoutAutoFill" parent="Widget.AppCompat.EditText"> 
    <item name="android:importantForAutofill">no</item> 
</style> 

然后在你的活动主题设置此样式editTextStyle。

<item name="android:editTextStyle">@style/EditTextStyleWithoutAutoFill</item> 
+0

'importantForAutofill'这里记录https://developer.android.com/guide/topics/text/testautofill.html#trigger_autofill_in_your_app –

12

目前有禁用自动填充整个应用程序没有直接的方法,因为自动填充功能是查看具体。

,您仍然可以尝试这种方式,并呼吁BaseActivity 到处

public class BaseActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     disableAutoFill(); 
    } 

    @TargetApi(Build.VERSION_CODES.O) 
    private void disableAutoFill() { 
     getWindow().getDecorView().setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS); 
    } 
} 

您也可以通过这种方式强制请求自动填充。

public void forceAutofill() { 
    AutofillManager afm = context.getSystemService(AutofillManager.class); 
    if (afm != null) { 
     afm.requestAutofill(); 
    } 
} 

注:目前自动填充功能仅在API 26的Android 8.0奥利奥

希望这有助于提供!

10

我相信接受的答案是不正确:

所以,我有我自己的类,这是延伸android.support.v7.widget.AppCompatEditText和我所做的是改写下面的方法与以下值:

@Override 
public int getAutofillType() { 
    return AUTOFILL_TYPE_NONE; 
} 

没有其他解决方案的工作,甚至没有机器人:importantForAutofill = “无”。

getAutofillType()来自View类,所以它应该适用于其他类,比如TextInputEditText!

+2

这是现在唯一可行的解​​决方案,它为TextInputEditText做工不错呢! –

+1

添加代码示例以展示repo https://github.com/BukT0p/AutofillBug –

1

似乎是一个需要修正的错误:https://issuetracker.google.com/issues/67675432
与此同时,现在的解决方法是禁用整个项目的自动填充功能。 您可以在values-v26/styles.xml文件中添加以下的风格,或者你可以,如果你使用的是特定的风格为您的EditText视图编辑BaseEditTextStyle。

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText"> 
<item name="android:importantForAutofill">noExcludeDescendants</item> 
</style> 

,并在values-v26/themes.xml文件,你可以简单地添加到默认的主题,你正在使用你的应用程序中的项目editTextStyleandroid:editTextStyle类似以下内容:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
... 
<item name="android:editTextStyle">@style/App_EditTextStyle</item> 
<item name="editTextStyle">@style/App_EditTextStyle</item> 
</style> 

这种方式,您可以将此更改为全部您的EditTexts,而无需更改您的布局文件或活动(稍后,您可以轻松地删除它,当bug被修复时)。

+0

这是一个非常优雅的解决方案。感谢分享! – aashrey99

3

我遇到了这一点。事实证明,这个问题是由嵌套在TextInputLayout内的EditText上的提示文本造成的。

我做了一些挖掘,发现这个金块在26.0.0 Beta 2的发布说明。 Andorid Support Release Notes June 2017

TextInputLayout必须设置onProvideAutofillStructure提示()

,导致我尝试设置提示的TextInputLayout代替嵌套的EditText的。

这解决了崩溃问题对我来说。 例子:

  <android.support.design.widget.TextInputLayout 
       android:id="@+id/textInputLayout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="Some Hint Text" 
       android.support.design:hintAnimationEnabled="true" 
       android.support.design:hintEnabled="true" 
       android.support.design:layout_marginTop="16dp"> 

       <android.support.design.widget.TextInputEditText 
        android:id="@+id/editText" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"/> 

      </android.support.design.widget.TextInputLayout> 
+0

它解决了只TextInputEditText错误,更新我的回购(github.com/BukT0p/AutofillBug)与您的解决方案。但是AutoCompleteTextView有类似的错误。在API 27自动填充工作在同步模式,并导致UI冻结和滞后。所以,最好禁用自动填充功能,以避免不应该填充的视图 –

+0

即使我们在此线程中使用其他建议,要禁用自动填充功能,用户仍然可以长按一个视图并选择自动填充上下文菜单。我观察到,在某些情况下,您会被告知某个视图无法自动填充,但我还没有找到该标记。我已经看到一些涉及自定义视图的自动填充选项返回NONE的解决方案,但这并不适用于所有实现。 – Azethoth

+0

这个解决方案适用于我。用户仍然可以长时间点击输入字段并选择自动填写,但它不会崩溃 - 它什么也不做。谢谢。 –

-1

在你的EditText属性添加android:importantForAutofill="no" 这应该是一个临时的解决办法,将只适用于API 26+

+0

这与其他答案有何不同? –

0

参考Google issue tracker,它已得到修复。

这是固定在Android 8.1

如果有任何问题仍然存在,请Google issue tracker他们将重新打开检查报告。

+0

这个答案与问题无关。它*确实与[对问题的第一条评论]有关(https://stackoverflow.com/questions/45731372/disabling-android-o-auto-fill-service-for-an-application/45733114? noredirect = 1个#comment79411576_45731372)。 – CommonsWare

相关问题