我已经实现了一个我曾经传递给anko的applyRecursively的函数。
在这个函数里面,我想添加一个marginEnd是视图在LinearLayout里面,所以我写了下面的代码:
when(view.layoutParams) {
is LinearLayout.LayoutParams -> {
view.layoutParams.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
}
}
我收到的错误是view.layoutParams是一个可以更改的可变属性。所以我不得不强迫演员:
when(view.layoutParams) {
is LinearLayout.LayoutParams -> {
(view.layoutParams as LinearLayout.LayoutParams).marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
}
}
在这里看看stackoverflow我看到Kotlin并没有聪明地投入可以为空的变量,但是view.layoutParams不可为空,那么为什么智能投射不能推断出类型?
答案 0 :(得分:4)
在这种情况下,智能转换将不起作用,因为您执行类型检查的变量的类型可能已经更改,因为该检查成功通过(例如,通过不同的线程),如果确实如此,您' d当您尝试强制转换时,会收到运行时异常。
解决方案是要么像你一样手动执行转换,要么为你的函数引入一个临时的val
,智能转换会工作,因为我们知道它的类型不会改变:
val params = view.layoutParams
when(params) {
is LinearLayout.LayoutParams -> {
params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
}
}
修改:另外请注意,您还可以使用let
引入此变量:
view.layoutParams.let { params ->
when(params) {
is LinearLayout.LayoutParams -> {
params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
}
}
}