从类的Anko视图

时间:2017-02-24 15:18:23

标签: android kotlin anko

我已经实现了一个执行各种api请求的类,我的想法是该类的每个实例都有一个方法来创建一个视图,使其具有类似于界面的视图。

我的问题是我不知道应如何以良好的方式实施。

使用Anko和Kotlin的首选方式是什么?

1 个答案:

答案 0 :(得分:2)

Anko很棒documentation about that case(但谁读过文档,是吗?)

  

让我们说,CustomView是您的自定义View班级名称,而且   customView是您想要在DSL中写的内容。

     

如果您只打算在DSL周围使用自定义View   其他一些View

inline fun ViewManager.customView(theme: Int = 0) = customView(theme) {}
inline fun ViewManager.customView(theme: Int = 0, init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, theme, init)
     

现在你可以这样写:

frameLayout {
    customView()
}
     

...或者这个(参见UI包装器章节):

UI {
    customView()
}
     

但是,如果您想将视图用作没有UI的顶级窗口小部件   在Activity内包装,也可以添加:

inline fun Activity.customView(theme: Int = 0) = customView(theme) {}
inline fun Activity.customView(theme: Int = 0, init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, theme, init)

示例(我将如何使用它,您可以选择不同的方法):

class YourAwesomeButton: Button() {
    /* ... */ 
    fun makeThisButtonAwesome() {/* ... */}
}

/** This lines may be in any file of the project, but better to put them right under the button class */
inline fun ViewManager.yourAwesomeButton(theme: Int = 0) = yourAwesomeButton(theme) {}
inline fun ViewManager.yourAwesomeButton(theme: Int = 0, init: CustomView.() -> Unit) = 
    ankoView({ YourAwesomeButton(it) }, theme, init)

在另一个档案中:

class YourAwesomeActivity: Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(saveInstanceState)
        relativeLayout(R.style.YourAwesomeAppTheme) {
            yourAwesomeButton(R.style.YourAwesomeAppTheme) {
                makeThisButtonAwesome()
            }.lparams {
                centerInParent()
            }
        }
    }
}