我正在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的性质有关吗?
我缺少什么或做错了什么才能得到此错误?我该如何解决?
谢谢!
答案 0 :(得分:3)
根据Kotlin Properties and Fields documentation,val
属性是具有getter但没有setter的属性。 var
属性同时具有getter和setter。
如果您查看ImageView
,它有一个getDrawable()
,但没有setDrawable()
方法。 Kotlin会自动将Java类中的getter转换为属性,这就是为什么您完全可以使用myImageView.drawable
的原因。但是,由于没有setDrawable()
方法,所以这是val
属性。
您需要使用setImageDrawable()
之类的方法来设置图像。
答案 1 :(得分: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
“列表”被定义为val,因此您不能替换它。但由于它是可变列表,因此您可以更改其内容
“ list2”被定义为var,因此您可以将其替换。但是,它是一个不可更改的列表,因此其内容无法更改。