Kotlin智能转换不适用于LinearLayout.LayoutParams
我已经实现了一个函数,我曾经传递给anko`s递归应用。
在这个函数里面,我想添加一个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是不可空的,所以为什么聪明的演员不能推断类型?
在这种情况下,智能转换将不起作用,因为检查成功的类型(例如,通过其他线程)可能已经改变了类型检查的类型,如果检查成功了,运行时异常,当你试图转换它。
解决方法是或者像你一样手动进行演员,或者为你的功能引入一个临时的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) } } }
- Android防止查看消耗事件
- 在Android Studio中看不到“字体”资源类型
- 只有安全(?)或非空断言(!!)的电话才可以在一个可为空的接收器上
- 应用程序图标不显示在Android版本大于4.4.2的设备上
- ListView.CHOICE_MODE_SINGLE未解决的参考
- Android Studio 2.2无法找到所有kotlin文件的引用
- NoClassDefFoundError okhttp3.internal.io.FileSystem
- 如何用kotlin 1.1.0 kotlinx-coroutines-core lib的功能替换Anko的doAsync,uiThread?
- Kotlin – 在Android中转换Singleton DatabaseController的最佳方法