将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<Integer, Boolean>" />
<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>
构建成功,但警告出来(我已经过去了)。
答案 0 :(得分:31)
我有同样的警告,在我的情况下,将变量声明从布尔类型更改为布尔类型解决问题:
自:
<variable
name="readOnly"
type="Boolean" />
要:
<variable
name="readOnly"
type="boolean" />
所以,也许你可以尝试:
<variable
name="selectMap"
type="android.databinding.ObservableMap<Integer, boolean>" />
答案 1 :(得分:21)
您可以像这样添加safeUnbox:
android:text="@{Double.toString(safeUnbox(product.listPrice))}"
答案 2 :(得分:4)
对于原语,您应该使用特殊版本,而不是ObservableField<T>
:
ObservableInt
代表int
ObservableBoolean
代表boolean
ObservableFloat
代表float
ObservableChar
代表char
ObservableLong
代表long
ObservableByte
代表byte
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}"