web-dev-qa-db-ja.com

Android 8.0 TextInputEditTextのフォーカスでOreoがクラッシュする

一部のデバイスをAndroid 8.0に更新した後、TextInputEditTextname__内のTextInputLayoutname__フィールドに注目すると、アプリはこのExceptionname__でクラッシュします。

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/TextInputLayoutname__がクラッシュしなくなりました。

デバイスで新しい8.0自動入力サービスを無効にせずにクラッシュを防ぐにはどうすればよいですか?

95
jesobremonte

私もこれに遭遇しました。この問題は、EditText内にネストされたTextInputLayoutにヒントテキストを設定することによって発生したことが判明しています。

26.0.0 Beta 2リリースノートで掘り下げてこのナゲットを見つけました。 2017年6月のAndroidサポートリリースノート

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>

私はこれを答えとして投稿しました here ブックマークを混同していたので。同じ回答を2回投稿してすみません。

174
Azethoth

EditTextに以下の属性を追加します。

Android:importantForAutofill="noExcludeDescendants"

21
Random

ルーク・シンプソンはほぼ正解で、「themes.xml」ではなく「styles.xml」を使用するだけです。

V26を目指して、より明確にするために、バージョン修飾子を使用して新しいスタイルファイルを作成しました。
v26/styles.xmlのAppThemeをコピーして貼り付け、editTextStyle項目に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に対してallを変更します。

9
Endy Silveira

importantForAutofill に任意の値を設定できます。スタイルまたはXMLでは、EditTextにフォーカスを合わせるとNPEが修正されますが、EditTextを長押ししてオートフィルをクリックすると修正されません。このバグに関するバグレポートを見つけました こちら .

THX。

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>
4
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のimportantForAutoFillプロパティを配置し、8.1でオートフィルを機能させたい場合は、単に

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

したがって、自動入力プロパティは8.1で機能します。 8.0ではクラッシュが深刻化しており、8.1ではすでに修正されているため、8.0でのみ無効になります。

0
Monika Saini

まだ「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>
0
Prakash Bala