Android 数据绑定-safeUnbox警告

Android 数据绑定-safeUnbox警告,android,data-binding,android-gradle-plugin,warnings,android-databinding,Android,Data Binding,Android Gradle Plugin,Warnings,Android Databinding,在我升级为gradle版本到2.3.0之后, 数据绑定遇到警告: 警告:selectMap[index]是一个已装箱的字段,但需要取消装箱才能执行selectMap[index]@android:color/white:@android:color/transparent。这可能会导致NPE,因此数据绑定将安全地解除其绑定。您可以更改表达式,并使用safeUnbox()显式包装selectMap[index],以防止出现警告 selectMap是一个ObservableMap,然后我搜索了这个警

在我升级为gradle版本到2.3.0之后, 数据绑定遇到警告:

警告:selectMap[index]是一个已装箱的字段,但需要取消装箱才能执行selectMap[index]@android:color/white:@android:color/transparent。这可能会导致NPE,因此数据绑定将安全地解除其绑定。您可以更改表达式,并使用safeUnbox()显式包装selectMap[index],以防止出现警告

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

我按照链接中的方法,将
selectMap[index]
修改为
safeUnbox(selectMap[index])
但出现语法错误

有人知道如何修复这个警告吗


编辑: 以下是xml文件代码

<?xml version="1.0" encoding="utf-8"?>



构建成功,但出现了警告(我在上面已经过了)。

我收到了相同的警告,在我的例子中,将变量声明从布尔类型更改为布尔类型解决了问题:

发件人:


致:


所以,也许你可以尝试一下:

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

您可以像这样添加safeUnbox:

android:text="@{Double.toString(safeUnbox(product.listPrice))}"
safeUnbox()
添加到警告变量将使此警告消失,并且仍能正常工作

android:alpha="@{alpha != null ? safeUnbox(alpha) : 0.5f}"

我在执行以下操作时弹出了此警告:

 android:visibility="@{viewmodel.isLoading ? View.INVISIBLE : View.VISIBLE}"
像这样添加safeunbox:

 android:visibility="@{safeUnbox(viewmodel.isLoading) ? View.INVISIBLE : View.VISIBLE}"
已删除重建后的警告

w:警告:已启用是一个已装箱的字段,但需要取消装箱 要执行android,请选中

出现此警告的原因是启用字段可以为空。如果使用
布尔值
而不是
布尔值
,则
布尔值
可以为空。所以这个警告来了。此字段可以使
NullPointerException

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

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

....

<Switch
    android:checked="@{enabled}"
    />
------------案例2-双向绑定------------------- 如果有双向绑定,则不能使用
safeUnbox()
way,因为

解决方案2 为safeUnbox制作反向绑定适配器有很长的路要走

什么是safeUnbox()方法?
safeUnbox()
只需检查空值并返回非空值。您可以看到以下在数据绑定库中定义的方法

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

我解释过布尔运算,这个解决方案对于
整数
双精度
字符
等都是一样的。而不是
可观察字段
,你应该为原语使用特殊版本:

  • int
  • observebolean
    用于
    布尔值
  • observefloat
    用于
    float
  • observechar
    用于
    char
  • ObservableLong
    对于
    long
  • 可观察字节
    用于
    字节
  • observeshort
    用于
    short

  • 每当您使用自定义的
    BindingAdapter
    时,这也会出现,因此在我的例子中,我需要将第二个参数设置为可为null,并且警告消失了

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

    我没有使用Java,但如果您确保包含
    @Nullable
    注释,并执行空条件。

    您的问题代码在哪里?字符串是否也有相同的问题?在我的例子中,只有布尔型对不起,字符串没有问题,这是另外一个问题。我认为safeUnbox是一个简单的解决方案
    public静态布尔safeUnbox(java.lang.boolean boxed){return boxed==null?false:(boolean)boxed;}
    在android.databinding.DynamicCutili不建议使用
    safeUnbox
    方法。如果开发人员使用的是可为null的
    布尔
    类型,并将其设置为
    null
    ,那么他或她可能不是指
    false
    。使用不可为空的
    boolean
    类型如果您不需要为空,请使用自定义适配器显式处理
    null
    ,或者-如果您正在使用
    boolean
    ,但不希望在当前状态下使用
    null
    ,只需让应用程序抛出
    NPE
    ,以警告您存在需要修复的错误。
    <variable
        name="enabled"
        type="Boolean"/>
    
    ....
    
    <Switch
        android:checked="@{enabled}"
        />
    
    <Switch
        android:checked="@{safeUnbox(fieldName)}"
        />
    
    <variable
        name="enabled"
        type="boolean"/>
    
    <variable
        name="enabled"
        type="Boolean"/>
    
    ....
    
    <Switch
        android:checked="@={enabled}"
        />
    
    <Switch
        android:checked="@{safeUnbox(fieldName)}"
        />
    
    <variable
        name="enabled"
        type="boolean"/>
    
    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;
    }
    
    @BindingAdapter("xyz")
    fun xyzAdapter(view: View, value: Int?) {
      value?.let {
        //TODO
      }
    }