【发布时间】:2016-12-07 14:42:55
【问题描述】:
我知道我可以使用 Anko 的 id 属性来识别视图:
class MainActivityUI : AnkoComponent<MainActivity> {
override fun createView(ui: AnkoContext<MainActivity>) = with(ui) {
frameLayout {
textView {
id = R.id.text
}
}
}
}
然后使用find()函数(或使用Kotlin Android Extensions)在Activity中获取它:
class MainActivity : AppCompatActivity() {
private val textView by lazy {
find<TextView>(R.id.text)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MainActivityUI().setContentView(this)
textView.text = "Hello World"
}
}
但我觉得我错过了什么; README 提到 find 函数或 Kotlin Android 扩展的唯一地方是在标题为支持现有代码的部分中:
您不必使用 Anko 重写所有 UI。你可以保持你的旧 用 Java 编写的类。此外,如果您仍然想要(或必须) 编写一个 Kotlin 活动类并为一些扩展 XML 布局 原因,您可以使用 View 属性,这会使事情变得更容易:
// Same as findViewById(), simpler to use val name = find<TextView>(R.id.name) name.hint = "Enter your name" name.onClick { /*do something*/ }您可以使用 Kotlin Android 使您的代码更加紧凑 扩展。
这使得find 函数看起来仅用于支持“旧”XML 代码。
所以我的问题是这样的;使用id 和find 函数是使用Anko 从Activity 访问View 的正确方法吗?有没有更“Anko”的方式来处理这个问题?还是我错过了 Anko 的其他一些好处,使得从 Activity 访问 View 无关紧要?
还有第二个相关问题;如果这是从Activity 访问View 的正确方法,有没有办法从AnkoComponent 中创建id 资源(即"@+id/")?而不是在ids.xml 文件中创建每个id。
【问题讨论】: