【问题标题】:Val cannot be reassigned error even though I have already changed it to Var KotlinVal cannot be reassigned 错误,即使我已经将其更改为 Var Kotlin
【发布时间】:2020-10-03 19:52:57
【问题描述】:

我在 IntelliJ 中使用 Kotlin。

我有这个简短的代码

        val myLayoutView = v.findViewById(R.id.layout) as LinearLayout
        var myImageView = v.findViewById(R.id.image) as ImageView
        val myLabelView =v.findViewById(R.id.label) as TextView

        var app = getItem(position) as AppObject
        myLabelView.text = app.appName
        myImageView.drawable = app.appImage

为什么在世界上它告诉我就行了:

        myImageView.drawable = app.appImage

“不能重新分配 Val”任何 val 实例都已完全更改为 var 相对于提到的变量。

我已经在其他类中更改了具有相同名称的变量,以确保甚至将类中的每个变量都更改为 var,但我仍然收到此错误。

这和drawable的性质有关吗?

我错过了什么或做错了什么来得到这个错误,我该如何解决?

谢谢!

【问题讨论】:

标签: android kotlin intellij-idea android-drawable var


【解决方案1】:

根据Kotlin Properties and Fields documentationval 属性是具有 getter 但没有 setter 的属性。 var 属性同时具有 getter 和 setter。

如果您查看ImageView,它有一个getDrawable(),但没有setDrawable() 方法。 Kotlin 自动将 Java 类中的 getter 转换为属性,这就是为什么您可以使用 myImageView.drawable 的原因。但是,由于没有 setDrawable() 方法,所以这是一个 val 属性。

您需要使用setImageDrawable()等方法来设置图像。

【讨论】:

  • 谢谢!我仍然非常缺乏经验,所以只是为了澄清这是否是您所说的使用 setImageDrawable() 的正确方法:
    val myLayoutView = v.findViewById(R.id.layout) as LinearLayout <br/> var myImageView = v.findViewById(R.id.image) as ImageView <br/> val myLabelView =v.findViewById(R.id.label) as TextView <br/> <br/> var app = getItem(position) as AppObject <br/> myLabelView.text = app.appName <br/> myImageView.setImageDrawable(app.appImage)
  • 假设app.appImageDrawable,是的,完全正确。
  • 太棒了,非常感谢伊恩!有趣的是在这次迭代之前我错误地使用了 setImageDrawable() 并且正在寻找其他方法来再次使用它哈哈。
【解决方案2】:

您误解了该语句中 var 的含义。

“var myImageView”表示“var myImageView”的值可以改变。换句话说,您可以为其分配不同的 ImageView。它不适用于内容。

一个更好的例子:

val list = mutableListOf(1, 2, 3)
var list2 = listOf(1, 2, 3)

list.add(5)            <----- Yes
list2.add(5)           <----- No

list = mutableListOf(3, 4, 5)   <----- No
list2 = mutableListOf(3, 4, 5)  <----- Yes

"list" 被定义为 val 所以你不能替换它。但由于它是一个可变列表,您可以更改其内容

"list2" 被定义为一个 var,因此您可以将其替换为另一个。但是,它是一个不可变的列表,所以它的内容不能改变。

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2016-11-05
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多