カブトムシのつぼ

茹で蛙防止!

Android 8.0.0のEditTextをタップすると view.getBoundsOnScreen() でNPE

Android 8.0.0でEditTextをタップした時にクラッシュしていた。

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.<init>(AssistStructure.java:484)
       at android.app.assist.AssistStructure.<init>(AssistStructure.java:1908)
       at android.app.ActivityThread.handleRequestAssistContextExtras(ActivityThread.java:3038)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1810)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6565)
       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)

これはOS8.0.0で起こるバグで、OS8.0.1にアップデートすれば治るとのこと。原因はAutofillまわりで、qiitaには以下のようにAutofill自体をしないようにしてクラッシュさせない方法があがっていた。

(qiitaから引用しました)

<style name="MyTheme" parent="@style/Nanika">
  ...
  <item name="editTextStyle">@style/EditTextStyle</item>
  ...
</style>

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

ただ、これだとAutofill自体が効かなくなってしまう。なので、issuetrackerにあがっていたもう一つの方法を試してみたらクラッシュしなくなった。

というのも、このクラッシュは以下のようにTextInputLayoutの子要素にEditTextがあり、その中でhintを使っている時に起こるようだった。そのhintを親のTextInputLayoutに移せばクラッシュは起きなくなった。

            <android.support.design.widget.TextInputLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <android.support.design.widget.TextInputEditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/hint" />
            </android.support.design.widget.TextInputLayout>

原因が結局モヤっとしているのだけど、OS8.0.0の全端末でこの事象が起きる訳ではなく一部の端末で起きていて、しかもOSのアップデートで治るのなら根深いんだろうな、と思ってそれ以上は深く掘って調べてない。

Android 8 (Oreo) の EditText をタップするとクラッシュする - Qiita Android O Preview 3 AssistStructure View.getBoundsOnScreen NPE [62834931] - Visible to Public - Issue Tracker