当前位置: 首页 > 知识库问答 >
问题:

柯特林智能投射不适用于线性布局。LayoutParams

卢雅惠
2023-03-14

我已经实现了一个函数,我过去常常传递给anko的应用程序递归。

在这个函数里面,我想添加一个边际结束是视图在一个LinearLayout里面,所以我写了下面的代码:

when(view.layoutParams) {
    is LinearLayout.LayoutParams -> {
        view.layoutParams.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
    }
}

我收到错误,即视图.布局参数是一个可变属性,可以更改。所以我不得不强迫演员:

when(view.layoutParams) {
    is LinearLayout.LayoutParams -> {
        (view.layoutParams as LinearLayout.LayoutParams).marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
    }
}

在这里看堆栈溢出,我看到 Kotlin 不会在可为空的变量中智能强制转换,但 view.layoutParams 不能为空,那么为什么智能强制转换无法推断出类型呢?

共有1个答案

丰佐
2023-03-14

在这种情况下,智能强制转换将不起作用,因为执行类型检查的变量的类型可能已更改,因为该检查已成功通过(例如,由其他线程通过),如果成功,则在尝试强制转换时会得到运行时异常。

解决方案是像您一样手动执行强制转换,或者为您的函数引入一个临时,智能强制转换将起作用,因为我们知道其类型不会更改:

val params = view.layoutParams
when(params) {
    is LinearLayout.LayoutParams -> {
        params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
    }
}

编辑:作为附加说明,您也可以通过使用< code>let来引入此变量:

view.layoutParams.let { params ->
    when(params) {
        is LinearLayout.LayoutParams -> {
            params.marginEnd = view.resources.getDimensionPixelSize(R.dimen.min_spacing)
        }
    }
}
 类似资料:
  • 我在kotlin中实现了一个LinkedList,并编写了一个方法从中删除重复项: 在最后两行: (在addNodeToTail方法中),编译器表示由于复杂的表达式,智能转换是不可能的。我必须添加非空断言调用(!!)。 我想了解为什么这个解决方案不被接受,尽管while表达式检查该节点。next不为空。我想知道是否有比使用非空断言调用更好的解决方案(!!)。 感谢您的帮助

  • 问题内容: 我在其中动态添加了许多内容。我面临的问题是,每当我单独将onTouch侦听器应用于其时,它都会检测到触摸,但是当我向相对布局中添加触摸时,它永远不会响应。 此代码可以很好地检测触摸事件: 但是,当我在myRelativeLayout中添加所有这些TextViews时: 现在,永远不会调用onTouchListener。为什么呢? 问题答案: 导致您的布局,而不是触发触摸事件。尝试删除它

  • 我试图填充一个相对的布局与4卡视图在它。每个cardview由一个图像和一个文本视图组成。我将所有卡片视图包装在一个相对布局中,将相对布局包装在一个滚动视图中。不管用。如果我移除scrollview,它可以正常工作。尝试将scrollview放入相对布局中。但没有工作代码:

  • 我正在尝试使用静态编程语言反射从类及其成员生成JFrames。我创建了几个注释,其中一些在运行时存在,一些不存在。 组件注释: 启用注释: 我是这样使用这两个注释的: 如果我运行下面的代码: 我得到的唯一输出是这样的:< code>btn: [Component] 由于Retention设置为

  • 我如何将下面的代码从Java转换成Kotlin?

  • 主要内容:本节引言,1.本节学习图,2.weight(权重)属性详解:,3.为LinearLayout设置分割线,4.LinearLayout的简单例子:,5.注意事项:本节引言 本节开始讲Android中的布局,Android中有六大布局,分别是: LinearLayout(线性布局),RelativeLayout(相对布局),TableLayout(表格布局) FrameLayout(帧布局),AbsoluteLayout(绝对布局),GridLayout(网格布局) 而今天我们要讲解的就是