aS gradleバージョンを2.3.0にアップグレードした後、データバインディングで警告が発生します。
警告:selectMap [index]はボックス化されたフィールドですが、selectMap [index]を実行するにはボックス化解除する必要がありますか? @Android:color/white:@Android:color/transparent。これによりNPEが発生する可能性があるため、データバインディングは安全にボックス化を解除します。式を変更し、selectMap [index]をsafeUnbox()で明示的にラップして警告を防ぐことができます
selectMapはObservableMapであり、この警告を検索しますが、議論はほとんどなく、修正しませんでした
Android Studio 2.3.0-alpha1:データバインディング+ int unboxingによりコンパイルエラーが発生します
データバインディング-API 15-18のデータオブジェクトはnull
リンクの方法に従って、selectMap[index]
をsafeUnbox(selectMap[index])
に変更しましたが、構文エラーが発生しました。
だから誰もこの警告を修正する方法を知っていますか?
編集:これはXMLファイルのコードです
<?xml version="1.0" encoding="utf-8"?>
<data class="SupportCountryViewHolderBinding">
<variable
name="viewModel"
type="com.goodarc.care_about.activity.account.support_country.SupportCountryHolderViewModel" />
<variable
name="dataSource"
type="com.goodarc.care_about.module.assets_file.SupportCountry" />
<variable
name="selectMap"
type="Android.databinding.ObservableMap<Integer, Boolean>" />
<variable
name="index"
type="int" />
</data>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@{selectMap[index] ? @Android:color/white : @Android:color/transparent}"
Android:onClick="@{(v) -> viewModel.onItemSelectListener(selectMap, index)}"
Android:orientation="vertical"
Android:padding="20dp">
<TextView
style="@style/TitleLabel2"
Android:layout_gravity="center_vertical|start"
Android:text="@{dataSource.display}"
Android:textColor="@{selectMap[index] ? @Android:color/black : @Android:color/white}"
tools:text="Taiwan (+886)" />
</LinearLayout>
ビルドは成功しますが、警告が表示されます(上記の過去)。
私は同じ警告を受けましたが、私の場合、変数宣言をBoolean typeからboolean typeに変更すると問題が解決します:
から:
<variable
name="readOnly"
type="Boolean" />
に:
<variable
name="readOnly"
type="boolean" />
だから、多分あなたは試すことができます:
<variable
name="selectMap"
type="Android.databinding.ObservableMap<Integer, boolean>" />
次のようにsafeUnboxを追加できます。
Android:text="@{Double.toString(safeUnbox(product.listPrice))}"
w:警告:enabledはボックス化されたフィールドですが、実行するにはボックス化解除する必要がありますAndroid:checked。
この警告は、enabledフィールドがnullになる可能性があるために発生します。 Boolean
の代わりにboolean
を使用する場合、Boolean
はnullになる可能性があります。そのため、この警告が表示されます。このフィールドがNullPointerException
を作成できること。
----------------ケース1-片方向バインディング----------------
<variable
name="enabled"
type="Boolean"/>
....
<Switch
Android:checked="@{enabled}"
/>
<Switch
Android:checked="@{safeUnbox(fieldName)}"
/>
Boolean
をプリミティブ型boolean
に変更します。 nullにならないように、 デフォルト値boolean
はfalse
です。
<variable
name="enabled"
type="boolean"/>
----------------ケース2-双方向バインディング----------------双方向バインディングがある場合、 safeUnbox()
は反転されない なので、safeUnbox()
方法を使用できません。
<variable
name="enabled"
type="Boolean"/>
....
<Switch
Android:checked="@={enabled}"
/>
これは今は動作しません。
<Switch Android:checked="@{safeUnbox(fieldName)}" />
Boolean
をプリミティブ型boolean
に変更します。 nullにならないように、- デフォルト値 of boolean
はfalseです。
<variable
name="enabled"
type="boolean"/>
長い道のりは、safeUnboxのinverse binding adaptersを作成することです。 こちらを参照 。
safeUnbox()
はnull値をチェックし、null以外の値を返します。データバインディングライブラリで定義されている以下のメソッドを見ることができます。
public static int safeUnbox(Java.lang.Integer boxed) {
return boxed == null ? 0 : (int)boxed;
}
public static long safeUnbox(Java.lang.Long boxed) {
return boxed == null ? 0L : (long)boxed;
}
public static short safeUnbox(Java.lang.Short boxed) {
return boxed == null ? 0 : (short)boxed;
}
public static byte safeUnbox(Java.lang.Byte boxed) {
return boxed == null ? 0 : (byte)boxed;
}
public static char safeUnbox(Java.lang.Character boxed) {
return boxed == null ? '\u0000' : (char)boxed;
}
public static double safeUnbox(Java.lang.Double boxed) {
return boxed == null ? 0.0 : (double)boxed;
}
public static float safeUnbox(Java.lang.Float boxed) {
return boxed == null ? 0f : (float)boxed;
}
public static boolean safeUnbox(Java.lang.Boolean boxed) {
return boxed == null ? false : (boolean)boxed;
}
Integer
、Double
、Character
などでも同じです。ObservableField<T>
の代わりに、プリミティブに特別なバージョンを使用する必要があります。
ObservableInt
のint
ObservableBoolean
のboolean
ObservableFloat
のfloat
ObservableChar
のchar
ObservableLong
のlong
ObservableByte
のbyte
ObservableShort
のshort
私は次のようなことをしたときにこの警告ポップアップが表示されました:
Android:visibility="@{viewmodel.isLoading ? View.INVISIBLE : View.VISIBLE}"
safeunboxを次のように追加します。
Android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.INVISIBLE : View.VISIBLE}"
再構築後に警告を削除
これはカスタムBindingAdapter
を使用しているときにも表示される可能性があるため、私の場合、2番目の引数をNULL可能にする必要があり、警告はなくなりました。
@BindingAdapter("xyz")
fun xyzAdapter(view: View, value: Int?) {
value?.let {
//TODO
}
}
私はJavaを使用していませんが、@Nullable
アノテーションを必ず含めて、null条件を実行してください。