使用Anko访问Activity的视图

Bry*_*yan 6 android kotlin anko

我知道我可以使用idAnko 的属性来识别视图:

class MainActivityUI : AnkoComponent<MainActivity> {

    override fun createView(ui: AnkoContext<MainActivity>) = with(ui) {
        frameLayout {
            textView {
                id = R.id.text
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在Activity使用find()函数(或使用Kotlin Android Extensions)中获取它:

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"
    }

}
Run Code Online (Sandbox Code Playgroud)

但我觉得我错过了一些东西; README提到find功能的唯一地方或Kotlin Android Extensions位于标题为Supporting Existing Code的部分:

您不必使用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*/ }
Run Code Online (Sandbox Code Playgroud)

您可以使用Kotlin Android Extensions使您的代码更加紧凑.

这使得它似乎find只是用于支持"旧的"XML代码.

所以我的问题是这个; 是使用id随着find功能访问的正确方法ViewActivity使用安口?是否有更"Anko"的处理方式?或者我错过了Anko的其他一些好处,使得ViewActivity无关紧要的访问?


还有第二个相关问题; 如果这View从中访问a的正确方法Activity,有没有办法从内部创建id资源(即"@+id/")AnkoComponent?而不是idids.xml文件中创建每个.

Jac*_*cob 9

那么,为什么还要XML id用来定位View呢?因为我们已经使用Anko而不是XML.

在我看来,我们可以将视图元素存储在AnkoComponent而不是使用find viewid方法.检查代码打击:

class MainActivityUI : AnkoComponent<MainActivity> {

    lateinit var txtView: TextView

    override fun createView(ui: AnkoContext<MainActivity>) = with(ui) {
        frameLayout {
            txtView = textView {
                id = R.id.text // the id here is useless, we can delete this line.
            }
        }
    }

}

class MainActivity : AppCompatActivity() {

    lateinit var mainUI : MainActivityUI

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mainUI = MainActivityUI()
        mainUI.setContentView(this)

        mainUI.txtView.text = "Hello World"
    }

}
Run Code Online (Sandbox Code Playgroud)