ViewBindingを使ってAndroid開発をしているとき、
大量にViewを作るとBindingでエラーなることがあった。
原因
エラー文も文字化けてるし、原因を調べていくと
Javaの言語仕様「メソッドの引数の数の上限は254個」というものに引っかかっていた。
ViewBindingで自動生成されるコードを読んでいくと、
コンストラクタの第一引数がrootのView(一番外側のLayout)で、残りはlayout上で定義したView達が一つずつ渡されていた。
つまり、以下のようにTextViewを254個並べるレイアウトを用意すると
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity">
- <TextView
- android:id="@+id/textView1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hello World!"/>
- <TextView
- android:id="@+id/textView2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hello World!"/>
- :
- :
- :
- <TextView
- android:id="@+id/textView254"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hello World!"/>
- </LinearLayout>
※引数の順番は適当になっている模様。
- private ActivityMainBinding(@NonNull LinearLayout rootView, @NonNull TextView textView1,
- @NonNull TextView textView10, @NonNull TextView textView100, @NonNull TextView textView101,
- @NonNull TextView textView102, @NonNull TextView textView103, @NonNull TextView textView104,
- @NonNull TextView textView93, @NonNull TextView textView94, @NonNull TextView textView95,
- :
- :
- @NonNull TextView textView96, @NonNull TextView textView97, @NonNull TextView textView98,
- @NonNull TextView textView99) {
よって、Layout内にViewが254個以上あると、自動生成されるコードのコンストラクタの引数の数が255個以上になってしまい、コンパイルエラーになる仕組。
なので、ViewBindingで扱えるViewの上限個数は253個ということになる。
対策
ViewがViewBindingの引数になる条件はViewIDを持っている事。
なので操作不要なViewにはIDを振らないようにしよう。
でもレイアウト側で相対位置調整等をしていたらViewIDを振らざる負えない...
そういう時はViewBindingを使うのをやめて、原始的にfindViewByIdを使って制御しよう。
0 件のコメント:
コメントを投稿