7

Android データ バインディング サポートの最も優れた機能の 1 つは、ID が設定されたビューのフィールドも生成することです。これにより、フィールドやfindViewById()呼び出しが不要になるため、コードベースが整理されます。

bind()しかし問題は、バインディング インスタンスは、バインディングをスケジュールする傾向がある呼び出しを介してのみ取得できることです。これは、データが非同期に受信され、一般的NullPointerExceptionにスローされる場合には問題です。

実際のデータ バインディング プロセスを除いて、View フィールドを持つバインディング インスタンスを取得できますか?

スタックトレース:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
         at com.app.android.databinding.ActivityRestaurantDetailsBinding.executeBindings(ActivityRestaurantDetailsBinding.java:381)
         at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:350)
         at android.databinding.ViewDataBinding$6.run(ViewDataBinding.java:167)
         at android.databinding.ViewDataBinding$5.onViewAttachedToWindow(ViewDataBinding.java:137)
         at android.view.View.dispatchAttachedToWindow(View.java:14525)
4

2 に答える 2

3

これは意味がないようです。データバインディングはnull変数を無視するため、nullポインターをスローする必要はありません。つまり、最も促進された機能の1つだと思います。非同期呼び出しなどの後に変数を変更する必要がある場合は、単に使用できますdataBinding.executePendingBindings()

ドキュメントから

生成されたバインディング クラスには、記述された変数ごとにセッターとゲッターがあります。変数は、setter が呼び出されるまでデフォルトの Java 値を取ります — 参照型の場合は null、int の場合は 0、boolean の場合は false などです。

生成されたデータ バインディング コードは自動的に null をチェックし、null ポインター例外を回避します。たとえば、式 @{user.name} では、user が null の場合、user.name にはデフォルト値 (null) が割り当てられます。age が int である user.age を参照していた場合、デフォルトは 0 になります。

于 2016-03-05T03:58:05.810 に答える