我已经实现了一个执行各种api请求的类,我的想法是该类的每个实例都有一个方法来创建一个视图,使其具有类似于界面的视图。
我的问题是我不知道应如何以良好的方式实施。
使用Anko和Kotlin的首选方式是什么?
答案 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()
}
}
}
}