如何在布局代码中轻松访问 anko 组件

How to easily access anko components within the layout code

使用 Anko,可以轻松访问之前定义的组件。例如:

verticalLayout {
    val name = editText()
    button("Say Hello") {
        onClick { ctx.toast("Hello, ${name.text}!") }
    }
}

由于编辑文本是在按钮之前定义的,因此访问起来很容易。 但是,当您要访问的组件定义在当前元素之后,是当前元素的父元素,或者在当前元素的兄弟元素中时,我不知道访问它的简单方法。以下是一些示例:

之后定义的元素

verticalLayout {
    button("Say Hello") {
        // how to access "name" here?
    }
    val name = editText()
}

在同级中定义的元素

verticalLayout {
    verticalLayout {
        val name = editText()
    }
    button("Say Hello") {
        // how to access "name" here?
    }
}

元素是父元素

val layout = verticalLayout {
    button("Say Hello") {
        // how to access "layout" here?
    }
}

如果我在没有 Anko 的情况下使用传统的 XML 布局文件来做同样的事情,我可以简单地用 findViewById() 引用那些元素。有没有一种使用 Anko 访问它们的简单方法?

Since Kotlin 1.2, you can use lateinit 对于局部变量,它可能是您需要的解决方案,使您的变量达到所需的范围:

之后定义的元素:

verticalLayout {
    lateinit var name: EditText
    button("Say Hello") {
        // use name
    }
    name = editText()
}

在兄弟中定义的元素:

verticalLayout {
    lateinit var name: EditText
    verticalLayout {
        name = editText()
    }
    button("Say Hello") {
        // use name
    }
}

元素是父元素:

lateinit var layout: LinearLayout
layout = verticalLayout {
    button("Say Hello") {
        // use layout
    }
}