web-dev-qa-db-ja.com

データバインディング-safeUnbox警告

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&lt;Integer, Boolean&gt;" />

    <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>

ビルドは成功しますが、警告が表示されます(上記の過去)。

45
Ivan

私は同じ警告を受けましたが、私の場合、変数宣言をBoolean typeからboolean typeに変更すると問題が解決します:

から:

<variable
        name="readOnly"
        type="Boolean" />

に:

<variable
        name="readOnly"
        type="boolean" />

だから、多分あなたは試すことができます:

<variable
    name="selectMap"
    type="Android.databinding.ObservableMap&lt;Integer, boolean&gt;" />
34

次のようにsafeUnboxを追加できます。

Android:text="@{Double.toString(safeUnbox(product.listPrice))}"
23
dazza5000

w:警告:enabledはボックス化されたフィールドですが、実行するにはボックス化解除する必要がありますAndroid:checked

この警告は、enabledフィールドがnullになる可能性があるために発生します。 Booleanの代わりにbooleanを使用する場合、Booleanはnullになる可能性があります。そのため、この警告が表示されます。このフィールドがNullPointerExceptionを作成できること。

----------------ケース1-片方向バインディング----------------

<variable
    name="enabled"
    type="Boolean"/>

....

<Switch
    Android:checked="@{enabled}"
    />

解決策1

<Switch
    Android:checked="@{safeUnbox(fieldName)}"
    />

解決策2

Booleanをプリミティブ型booleanに変更します。 nullにならないように、 デフォルト値booleanfalseです。

<variable
    name="enabled"
    type="boolean"/>

----------------ケース2-双方向バインディング----------------双方向バインディングがある場合、 safeUnbox()は反転されない なので、safeUnbox()方法を使用できません。

<variable
    name="enabled"
    type="Boolean"/>

....

<Switch
    Android:checked="@={enabled}"
    />

これは今は動作しません。

<Switch
    Android:checked="@{safeUnbox(fieldName)}"
    />

解決策1

Booleanをプリミティブ型booleanに変更します。 nullにならないように、- デフォルト値 of booleanはfalseです。

<variable
    name="enabled"
    type="boolean"/>

解決策2

長い道のりは、safeUnboxinverse binding adaptersを作成することです。 こちらを参照

SafeUnbox()メソッドとは何ですか?

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;
}

ブール値について説明しましたが、このソリューションはIntegerDoubleCharacterなどでも同じです。

9
Khemraj

ObservableField<T>の代わりに、プリミティブに特別なバージョンを使用する必要があります。

  1. ObservableIntint
  2. ObservableBooleanboolean
  3. ObservableFloatfloat
  4. ObservableCharchar
  5. ObservableLonglong
  6. ObservableBytebyte
  7. ObservableShortshort
7
Eugen Martynov

私は次のようなことをしたときにこの警告ポップアップが表示されました:

 Android:visibility="@{viewmodel.isLoading ? View.INVISIBLE : View.VISIBLE}"

safeunboxを次のように追加します。

 Android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.INVISIBLE : View.VISIBLE}"

再構築後に警告を削除

5
JimmyFlash

これはカスタムBindingAdapterを使用しているときにも表示される可能性があるため、私の場合、2番目の引数をNULL可能にする必要があり、警告はなくなりました。

@BindingAdapter("xyz")
fun xyzAdapter(view: View, value: Int?) {
  value?.let {
    //TODO
  }
}

私はJavaを使用していませんが、@Nullableアノテーションを必ず含めて、null条件を実行してください。

0
Juan Mendez