2018-09-24
※本記事は、はてなブログに掲載していた記事を移行したものです
文字入力欄などで、Hint表示やバリデーションエラーメッセージなどを表示するのにTextInputLayoutを使うことがしばしばありますよね。
今回は、これを使って実装していた時に特定OSで起きていた問題に対してのアプローチを書いていこうと思います。
TextInputLayoutで作った入力欄をフォーカスすると、以下のNullPointerExceptionを吐いてクラッシュすることがある
<android.support.design.widget.TextInputLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:hintAnimationEnabled="true"
app:hintEnabled="true"
app:errorEnabled="false">
<android.support.design.widget.TextInputEditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="プレースホルダーかつヒントだよ" />
</android.support.design.widget.TextInputLayout>
java.lang.NullPointerException:
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:3056)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1820)
at android.os.Handler.dispatchMessage (Handler.java:105)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6592)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:769)
Android 8.0.
Android8.0から実装されたAutofillが有効になっている。
動的にsetText()
でテキストがセットされたTextInputLayoutをフォーカスする
hintを挿入する位置をTextInputEditText -> TextInputLayoutに入れ替える
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="ヒントはここに書くよ"
app:hintAnimationEnabled="true"
app:hintEnabled="true"
app:errorEnabled="false">
<android.support.design.widget.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>
TextInputEditTextに以下の属性を追加する。
android:importantForAutofill="noExcludeDescendants"
調べてみると、公式でも共有されている8.0特有のバグだそう↓
https://issuetracker.google.com/issues/62834931
内容を追ってみると、
The issue is fixed on Android 8.1.
ということで、8.0にのみ残るバグとなってしまったみたい。かなしみ・・・。
android:importantForAutofill="noExcludeDescendants"
を追加したらいいよ!色んなアプリでこのような入力欄を作ることはたくさんあると思うし、8.0ももちろんサポートすることになるからこの問題は避けて通れないなぁ・・・
皆さん気をつけましょう・・・!!
じゃ、そゆことで〜