Anko:应用的内部范围,令人困惑的 属性 分辨率
Anko: inner scope of apply, confusing property resolution
我正在使用 Anko DSL 编写 Android 布局。
在定义一个TextView
的时候,我想让它居中对齐,所以我这样写:
verticalLayout {
textView(R.string.txt_greeting).apply {
gravity = Gravity.CENTER_HORIZONTAL // <- this should have changed the alignment
textSize = 20.0f
}
//...
}
但对齐方式没有改变。在调试器中,我看到为 LinearLayout
设置了引力,它是 TextView
的父级。
将语句更改为
textView(R.string.txt_greeting).let { it.gravity = Gravity.CENTER_HORIZONTAL }
和
textView(R.string.txt_greeting).apply { this@apply.gravity = Gravity.CENTER_HORIZONTAL }
甚至
textView(R.string.txt_greeting).apply { this.gravity = Gravity.CENTER_HORIZONTAL }
解决了问题,因此在原始代码中隐式 this
肯定会解析为 this@verticalLayout
.
为什么会这样?
我是否误解了 Kotlin lambda 中的某些内容,或者这是 Kotlin 或 Anko 中的错误?
这实际上是范围界定中的错误。
corresponding issue 已被标记为已修复,因此修复可能会出现在下一个版本中。
我正在使用 Anko DSL 编写 Android 布局。
在定义一个TextView
的时候,我想让它居中对齐,所以我这样写:
verticalLayout {
textView(R.string.txt_greeting).apply {
gravity = Gravity.CENTER_HORIZONTAL // <- this should have changed the alignment
textSize = 20.0f
}
//...
}
但对齐方式没有改变。在调试器中,我看到为 LinearLayout
设置了引力,它是 TextView
的父级。
将语句更改为
textView(R.string.txt_greeting).let { it.gravity = Gravity.CENTER_HORIZONTAL }
和
textView(R.string.txt_greeting).apply { this@apply.gravity = Gravity.CENTER_HORIZONTAL }
甚至
textView(R.string.txt_greeting).apply { this.gravity = Gravity.CENTER_HORIZONTAL }
解决了问题,因此在原始代码中隐式 this
肯定会解析为 this@verticalLayout
.
为什么会这样?
我是否误解了 Kotlin lambda 中的某些内容,或者这是 Kotlin 或 Anko 中的错误?
这实际上是范围界定中的错误。
corresponding issue 已被标记为已修复,因此修复可能会出现在下一个版本中。