Programming

TextInputEditText에 초점을 맞출 때 Android 8.0 Oreo 충돌

procodes 2020. 8. 24. 21:26
반응형

TextInputEditText에 초점을 맞출 때 Android 8.0 Oreo 충돌


일부 기기를 android 8.0으로 업데이트 한 후, TextInputEditText내부 필드 에 초점을 맞추면 TextInputLayout앱이 다음과 같이 충돌합니다 Exception.

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.view.View.getBoundsOnScreen(android.graphics.Rect)' on a null object reference
at android.app.assist.AssistStructure$WindowNode.(AssistStructure.java)
at android.app.assist.AssistStructure.(AssistStructure.java)
at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3035)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1807)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Android 설정-> 시스템-> 언어 및 입력-> 고급-> 자동 채우기 서비스-> 없음 으로 이동 한 다음 TextInputEditText / TextInputLayout더 이상 충돌하지 않는 것에 집중합니다 .

장치에서 새로운 8.0 자동 채우기 서비스를 비활성화하지 않고 충돌이 발생하지 않도록하려면 어떻게해야합니까?


나는 이것도 만났다. EditText.NET 내부에 중첩 된 힌트 텍스트를 설정하여 문제가 발생한 것으로 밝혀졌습니다 TextInputLayout.

몇 가지 조사를했고 26.0.0 베타 2 릴리스 노트에서이 덩어리를 발견했습니다. Android 지원 출시 노트 2017 년 6 월

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>

북마크를 섞어서 여기 에 답변으로 게시했습니다 . 같은 답변을 두 번 게시해서 죄송합니다.


에 아래 언급 된 속성을 추가하십시오 EditText.

android:importantForAutofill="noExcludeDescendants"


Luke Simpson이 거의 올바르게 만들었습니다. "themes.xml"대신 "styles.xml"을 사용해야합니다.

더 명확하게하기 위해 v26을 목표로하는 버전 한정자로 새 스타일 파일을 만들었습니다. v26 / styles.xml을
복사하여 붙여넣고 스타일 AppThemeeditTextStyle항목을 추가 하십시오 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>

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

In this way you make this changes for all your EditTexts without needing to change your layout files.


I used the v26/themes.xml to override the EditText style autofill only for Oreo 8.0.0:

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

Note that I had to apply the style inline for each EditText in my layout xml for it to take effect. I tried to apply this change globally in my app theme but it didn't work for some reason.

// HAD TO DO THIS IN LAYOUT XML FOR EACH EDIT TEXT
<EditText
    style="@style/EditTextStyle"
    ... />


// THIS DIDN'T TAKE EFFECT IN THEMES XML (HAS BEEN ADDED TO MANIFEST)
<style name="APP_THEME" parent="@style/Theme.AppCompat.Light">
    <item name="android:editTextStyle">@style/EditTextStyle</item>
    <item name="editTextStyle">@style/EditTextStyle</item>
</style>

You can set any value for importantForAutofill with a style or in the XML it's fix for NPE when you focus the EditText but it's not fix if your long press the EditText and you click on AutoFill. I found a Bug Report about this bug here, please add a star and share your observations in the bug report also.

Thx.


@Luke Simpson is right. You can use it in themes.XML like:-

<item name="editTextStyle">@style/AppEditTextStyle</item>

and then put
<style name="AppEditTextStyle" parent="Widget.AppCompat.EditText">
        <item name="android:importantForAutofill">auto</item>
 </style>

in V26/app_styles.xml

But, I had to put empty tag also in app_styles.xml in the default folder. Otherwise, all the properties of Edit text were getting overriding by this and my edit text was not working properly. And when you put importantForAutoFill property for v26 and you want autofill to work in 8.1, you can simply put

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

So, autofill property works in 8.1. It will be disabled just for 8.0 as the crash is hapenning in 8.0 and it has already been fixed in 8.1.


If anyone still wants "hint" in "TextInputEditText" make app:hintEnabled="false" in TextInputLayout

<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:hintEnabled="false"
    app:passwordToggleEnabled="true">

    <com.google.android.material.textfield.TextInputEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="password"
        android:inputType="textPassword" />

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

참고URL : https://stackoverflow.com/questions/45840856/android-8-0-oreo-crash-on-focusing-textinputedittext

반응형