I had the same warning, in my case changing the variable declaration from Boolean type to boolean type solve the problem:

From:

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

To:

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

So, maybe you can try with:

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

You can add safeUnbox like this:

android:text="@{Double.toString(safeUnbox(product.listPrice))}"

w: warning: enabled is a boxed field but needs to be un-boxed to execute android:checked.

This warning comes because enabled field can be null. If you take Boolean instead of boolean, so Boolean can be null. So this warning comes. That this field can make NullPointerException.

---------------- Case 1 - One Way Binding----------------

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

....

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

Solution 1

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

Solution 2

Change Boolean to primitive type boolean. So that it never be null, default value of boolean is false.

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

---------------- Case 2 - Two-Way Binding---------------- When you have two-way binding, then you can not use safeUnbox() way, because safeUnbox() will not be inverted.

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

....

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

This will not work now.

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

Solution 1

Change Boolean to primitive type boolean. So that it never be null, default value of boolean is false.

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

Solution 2

A long way is to make inverse binding adapters for safeUnbox. See here.

What is safeUnbox() method?

safeUnbox() just check null value and return non-null value. You can see below methods which are defined in Data binding library.

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

I explained about Boolean, this solution is same for Integer, Double, Character etc.


Instead of ObservableField<T> you should use special version for the primitives:

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

I had this warning popup when i did something like :

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

adding safeunbox like so :

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

removed the warning after rebuild