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


101

일부 기기를 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 자동 채우기 서비스를 비활성화하지 않고 충돌이 발생하지 않도록하려면 어떻게해야합니까?


답변:


187

나는 이것도 만났다. 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>

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


android.support.design:hintAnimationEnabled 및 android.support.design:hintEnabled없이 작동합니까? TextInputLayout 소스를 살펴 보았는데 두 속성 모두 속성을로드 할 때 기본값으로 설정된 것 같습니다.
androidguy jul.

@androidguy 예, 해당 속성없이 작동해야합니다. 이러한 속성은 TextInputLayout에게 해당 항목의 레이아웃에 공간을 할당하도록 지시합니다 (또는 적어도 제가 관찰 한 것입니다)
Azethoth

@Azethoth이 솔루션은 동작을 유지하지 않습니다. 제 경우에는 플로팅 라벨 애니메이션에 사용하고 있습니다. 이런 식으로 사용하면 힌트 / 라벨이 나타나지 않습니다. 내가 볼 수있는 모든에서는 TextInput입니다
KrishnaCA

@KrishnaCA 꽤 이상합니다. 이 접근 방식은 내 앱의 모든 곳에서 사용하며 편집 텍스트에 힌트를 표시하고 부동 레이블로 애니메이션을 적용합니다. 문제의 원인이 무엇인지 잘 모르겠습니다. 질문에 xml 레이아웃의 코드 샘플을 게시하고 링크 할 수 있습니까? 기꺼이 도와 드리겠습니다.
Azethoth

답변에 게시 된 것과 동일합니다. 내가 테스트하는 장치는 화웨이입니다
KrishnaCA

25

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

android:importantForAutofill="noExcludeDescendants"


기능은 API 26 전용입니다. 최소 API가 26 미만인 경우 솔루션이 있습니까?
JPM

2
@JPM 걱정하지 마세요. 이전 API 수준에서는 무시되므로 충돌하거나 문제가되지 않습니다.
Pei

2
@JPM 문제는 Oreo에서만 발생하므로 이전 API에서는 무시되고 충돌하지 않습니다.
Gaurav Singh

이제 PROD에 내 앱이 제대로 작동하는 것 같습니다
JPM

1
이것은 잘못된 해결책입니다. EditText를 길게 누르고 메뉴에서 자동 채우기를 선택하면 충돌이 발생합니다. 올바른 (코드가 필요하지만) 솔루션 : stackoverflow.com/a/46698028/1714102
Przemo

11

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>

이런 식으로 레이아웃 파일을 변경할 필요없이 모든 EditText에 대해 이렇게 변경 합니다.


1
최소 API 요구 사항을 기록하고 v26 리소스 폴더에 배치해야합니다.
StarWind0

6

스타일 로 중요한 ForAutofill에 대한 값을 설정 하거나 XML에서 EditText에 초점을 맞출 때 NPE에 대해 수정되지만 EditText를 길게 누르고 AutoFill을 클릭하면 수정되지 않습니다. 여기 에서이 버그에 대한 버그 보고서를 찾았습니다 . 별표를 추가하고 버그 보고서에서도 관찰 한 내용을 공유하세요.

고마워.


5

v26 / themes.xml을 사용하여 Oreo 8.0.0에 대해서만 EditText 스타일 자동 채우기를 재정의했습니다.

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

적용하려면 레이아웃 xml의 각 EditText에 대해 인라인 스타일을 적용해야했습니다. 이 변경 사항을 내 앱 테마에 전역 적으로 적용하려고했지만 어떤 이유로 작동하지 않았습니다.

// 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>

0

@Luke Simpson이 맞습니다. 다음과 같이 themes.XML에서 사용할 수 있습니다.

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

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

V26 / app_styles.xml에서

하지만 기본 폴더의 app_styles.xml에도 빈 태그를 넣어야했습니다. 그렇지 않으면 편집 텍스트의 모든 속성이 이것으로 재정의되고 편집 텍스트가 제대로 작동하지 않았습니다. v26에 중요한 ForAutoFill 속성을 입력하고 8.1에서 자동 완성이 작동하도록하려면 간단히

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

따라서 autofill 속성은 8.1에서 작동합니다. 8.0에서 충돌이 발생하고 8.1에서 이미 수정되었으므로 8.0에서만 비활성화됩니다.


0

사람은 여전히 "원한다면 힌트 "에서 " TextInputEditText "메이크업의 hintEnabled는 = "false"로 : 응용 프로그램 에서 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>

0

나는 또한이 문제에 직면했고 마침내 우리는 안드로이드 8.0과 안드로이드 8.1에서 충돌의 이유를 얻었습니다.

첫 번째 이유 (중요한 단서) : xml의 빈 힌트 (android : hint = "")로 인해 oreo 장치에서 충돌이 발생합니다. 전체 프로젝트 검색에서 editText에서이 빈 힌트를 제거하십시오.

두 번째 이유 (위의 설명과 동일) : TextInputLayout을 사용한 경우 editText 힌트가 TextInputLayout 내에 표시되어야합니다. 그렇지 않으면 editText 내에서 힌트를 사용할 수 있습니다.

이것이 당신을 돕길 바랍니다!

감사합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.