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


100

一部のデバイスを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自動入力サービスを無効にすることなく、クラッシュの発生を防ぐにはどうすればよいですか?


回答:


186

私もこれに遭遇しました。この問題は、EditText内にネストされたにヒントテキストを設定したことが原因であることがわかりましたTextInputLayout

私は少し掘り下げて、このナゲットを26.0.0 Beta 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>

ブックマークを混同しているので、ここに回答として投稿しました。同じ回答を2回投稿してしまい申し訳ありません。


これはandroid.support.design:hintAnimationEnabledとandroid.support.design:hintEnabledなしで動作しますか?TextInputLayoutソースを確認したところ、属性をロードするときに両方の属性がデフォルトとして設定されているようです。
androidguy

@androidguyはい、これらの属性がなくても機能するはずです。これらの属性は、TextInputLayoutにそれらのアイテムのレイアウトにスペースを割り当てるように指示します(または少なくともそれが私が観察したものです)
Azethoth

@Azethothこのソリューションは動作を保持しません。私の場合、フローティングラベルアニメーションに使用しています。この方法で使用すると、ヒント/ラベルが表示されません。私が見ることができるのはテキスト入力だけです
KrishnaCA

@KrishnaCAかなり変です。私はこのアプローチをアプリの至る所で使用しており、編集テキストにヒントを表示し、フローティングラベルとしてアニメーション化します。問題の原因が何かはわかりません。あなたのxmlレイアウトのコードサンプルを質問に投稿して、それにリンクすることはできますか?お手伝いさせていただきます。
アゼトス

それはあなたの回答に投稿されたものと同じです。私がテストしたデバイスはHuawei
KrishnaCAです。

25

以下の属性をあなたの中に追加してくださいEditText

android:importantForAutofill="noExcludeDescendants"


機能はAPI 26専用です。最小APIが26未満の場合の解決策はありますか?
JPM

2
@JPM心配する必要はありません。古いAPIレベルでは無視されるため、クラッシュしたり問題が発生したりすることはありません。
ペイ

2
@JPMの問題はOreoでのみ発生するため、古いAPIでは無視され、クラッシュしません。
Gaurav Sing 2017

私はそれをPRODで使用していますが、私のアプリは問題なく動作しているようです
JPM

1
これは不正解です。EditTextを長押ししてメニューからAutofillを選択するとクラッシュします。正しい(コードが必要ですが)ソリューション:stackoverflow.com/a/46698028/1714102
Przemo

11

ルーク・シンプソンはほぼ正しく、「themes.xml」の代わりに「styles.xml」を使用する必要があります。

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


1
最小API要件に注意し、v26リソースフォルダーに配置する必要があります。
StarWind0

6

重要な ForAutofillの任意の値をスタイルまたはXMLで設定できます。これは、EditTextにフォーカスしたときのNPEの修正ですが、EditTextを長押ししてオートフィルをクリックした場合は修正されません。このバグに関するバグレポートをここで見つけました。星を追加し、バグレポートで観察結果を共有してください。

どうも。


5

Oreo 8.0.0の場合のみ、v26 / themes.xmlを使用して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

@ルークシンプソンは正しいです。次のように、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ではautofillプロパティが機能します。クラッシュは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

私もこの問題に直面しており、ついにAndroid 8.0とAndroid 8.1でクラッシュする理由がわかりました。

最初の理由(重要な手がかり):XMLの空のヒント(android:hint = "")はoreoデバイスでクラッシュにつながります。プロジェクト全体の検索でeditTextのこの空のヒントを削除してください。

2番目の理由(上記の説明と同じ):TextInputLayoutを使用した場合は、editTextヒントをTextInputLayout内に表示する必要があります。それ以外の場合は、editText内でヒントを使用できます。

これがあなたを助けることを願っています!!

ありがとうございました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.