数据绑定 - safeUnbox警告

Iva*_*van 48 data-binding android warnings android-gradle-plugin android-databinding

将AS gradle版本升级到2.3.0后,数据绑定会遇到警告:

警告:selectMap [index]是一个盒装字段但需要取消装箱才能执行selectMap [index]?@android:颜色/白色:@android:颜色/透明.这可能会导致NPE,因此数据绑定将安全地取消它.您可以更改表达式并使用safeUnbox()显式地包装selectMap [index]以防止出现警告

selectMap是一个ObservableMap,然后我搜索这个警告,但只进行了一些讨论而没有修复它

Android Studio 2.3.0-alpha1:Databinding + int拆箱会导致编译错误

数据绑定 - API 15-18上的数据对象为空

我按照链接的方式,修改selectMap[index]safeUnbox(selectMap[index])但语法错误.

所以任何人都知道如何修复此警告?


编辑:这是xml文件代码

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

构建成功,但警告出来(我在上面).

小智 34

我有同样的警告,在我的情况下,将变量声明从布尔类型更改为布尔类型解决问题:

从:

<variable
        name="readOnly"
        type="Boolean" />
Run Code Online (Sandbox Code Playgroud)

至:

<variable
        name="readOnly"
        type="boolean" />
Run Code Online (Sandbox Code Playgroud)

所以,也许你可以尝试:

<variable
    name="selectMap"
    type="android.databinding.ObservableMap&lt;Integer, boolean&gt;" />
Run Code Online (Sandbox Code Playgroud)


daz*_*000 23

您可以像这样添加safeUnbox:

android:text="@{Double.toString(safeUnbox(product.listPrice))}"
Run Code Online (Sandbox Code Playgroud)


Khe*_*raj 12

w:警告:enabled是一个装箱的字段,但需要取消装箱才能执行android:checked

出现此警告是因为enabled字段可以为null。如果您使用Boolean代替booleanBoolean则可以为null。所以这个警告来了。这个领域可以做到NullPointerException

----------------案例1-单向绑定----------------

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

....

<Switch
    android:checked="@{enabled}"
    />
Run Code Online (Sandbox Code Playgroud)

解决方案1

<Switch
    android:checked="@{safeUnbox(fieldName)}"
    />
Run Code Online (Sandbox Code Playgroud)

解决方案2

更改Boolean为原始类型boolean。因此,它不能为空,默认值booleanIS false

<variable
    name="enabled"
    type="boolean"/>
Run Code Online (Sandbox Code Playgroud)

----------------案例2-双向绑定---------------- 当您进行双向绑定时,可以不使用safeUnbox()方式,因为safeUnbox()不会倒置

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

....

<Switch
    android:checked="@={enabled}"
    />
Run Code Online (Sandbox Code Playgroud)

现在将无法使用。

<Switch
    android:checked="@{safeUnbox(fieldName)}"
    />
Run Code Online (Sandbox Code Playgroud)

解决方案1

更改Boolean为原始类型boolean。因此,它不能为空,默认值boolean是假的。

<variable
    name="enabled"
    type="boolean"/>
Run Code Online (Sandbox Code Playgroud)

解决方案2

一个很长的路要走,就是为safeUnbox制作反向绑定适配器看这里

什么是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;
}
Run Code Online (Sandbox Code Playgroud)

我约布尔解释,该解决方案是同为IntegerDoubleCharacter等等。


Eug*_*nov 7

而不是ObservableField<T>应该对原始类型使用特殊版本:

  1. ObservableInt 为了 int
  2. ObservableBoolean 为了 boolean
  3. ObservableFloat 为了 float
  4. ObservableChar 为了 char
  5. ObservableLong 为了 long
  6. ObservableByte 为了 byte
  7. ObservableShort 为了 short


Jam*_*l S 5

当我执行以下操作时,我会收到此警告弹出窗口:

 android:visibility="@{viewmodel.isLoading ? View.INVISIBLE : View.VISIBLE}"
Run Code Online (Sandbox Code Playgroud)

像这样添加safeunbox:

 android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.INVISIBLE : View.VISIBLE}"
Run Code Online (Sandbox Code Playgroud)

重建后删除警告