数据绑定 - safeUnbox警告

时间:2017-03-18 08:37:51

标签: android data-binding android-gradle warnings 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 unboxing causes compile errors

Databinding - data object is null on API 15-18

我按照链接的方式,将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>

构建成功,但警告出来(我已经过去了)。

6 个答案:

答案 0 :(得分:31)

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

自:

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

要:

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

所以,也许你可以尝试:

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

答案 1 :(得分:21)

您可以像这样添加safeUnbox:

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

答案 2 :(得分:4)

对于原语,您应该使用特殊版本,而不是ObservableField<T>

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

答案 3 :(得分:1)

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

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

像这样添加safeunbox:

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

删除了重建后的警告

答案 4 :(得分:0)

只要您使用自定义NumberObservations=100 minVal=1 maxVal=20 X = np.random.uniform(minVal,maxVal,(NumberObservations,1)) e = np.random.normal(0, 1, (NumberObservations,1)) Y= 10 + 5*X + e B = np.array([[0], [0]]) sum_y = sum(Y) sum_x = sum(X) sum_xy = sum(np.multiply(X, Y)) sum_x2 = sum(X*X) alpha = 0.00001 iterations = 15 def cost_fun(X, Y, B): b0 = B[0] b1 = B[1] s = (Y - (b0 + (b1*X)))**2 rss = sum(s) return rss def grad(X, Y, B): print("B = " + str(B)) b0 = B[0] b1 = B[1] g0 = -2*(Y - b0 - (b1*X)) g1 = -2*((X*Y) - (b0*X) - (b1*X**2)) grad = np.concatenate((g0, g1), axis = 1) return grad def gradient_descent(X, Y, B, alpha, iterations): cost_history = [0] * iterations m = len(Y) x0 = np.array(np.ones(m)) x0 = x0.reshape((100, 1)) X1 = np.concatenate((x0, X), axis = 1) for iteration in range(iterations): h = np.dot(X1, B) h = h.reshape((100, 1)) loss = h - Y g = grad(X, Y, B) gradient = (np.dot(g.T, loss) / m) B = B - alpha * gradient cost = cost_fun(X, Y, B) cost_history[iteration] = cost print("Iteration %d | Cost: %f" % (iteration, cost)) print("-----------------------------------------------------------------------") return B, cost_history newB, cost_history = gradient_descent(X, Y, B, alpha, iterations) # New Values of B print(newB) ,它也会出现,因此在我的情况下,我需要将第二个参数设置为可为空,并且警告消失了。

BindingAdapter

我没有使用Java,但是如果您确定要包含@BindingAdapter("xyz") fun xyzAdapter(view: View, value: Int?) { value?.let { //TODO } } 注释,并执行空条件。

答案 5 :(得分:-2)

safeUnbox()添加到警告变量将使此警告消失,它仍然可以正常工作

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