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 已被标记为已修复,因此修复可能会出现在下一个版本中。