Anko文档告诉我们如何向DSL添加自定义视图。但是,如果我的自定义视图是视图组,则会出现问题。
class MyFrameLayout(context: Context) : FrameLayout(context)
fun ViewManager.myFrameLayout(init: MyFrameLayout.() -> Unit = {}) = ankoView({ MyFrameLayout(it) }, init)
class MyUI : AnkoComponent<Fragment> {
override fun createView(ui: AnkoContext<Fragment>) = with(ui) {
myFrameLayout {
textView("hello").lparams { // error: Unresolved reference: lparams
bottomMargin = dip(40)
}
}
}
}
但如果我将myFrameLayout
调用更改为frameLayout
可以,则可以。那么,使视图组与Anko DSL一起使用的正确方法是什么?
如果我们看一下Anko的源代码,我们可以看到实际上frameLayout
返回了一个_FrameLayout
类的实例,其中lparams
定义了这些函数。以我的理解,这是必需的,因此这些lparams
功能仅在布局构建代码中可用。
在Anko的Layouts.kt
文件中_<ViewGroup>
,每个受支持的类都有这些类ViewGroup
。
因此,支持自定义视图组的直接方法是_<ViewGroup>
使用lparams
方法实现创建一个类。问题是_<ViewGroup>
该类通常包含比我<ViewGroup>
本身更多的代码!
而且,如果我想创建许多自定义视图组,则使用这种方法添加对它们的Anko支持变得很痛苦。比方说,我有MyFrameLayout1
,MyFrameLayout2
,MyFrameLayout3
类。它们基本上FrameLayout
是,因此我希望它们可以使用相同的布局参数。但我要创造_FrameLayout1
,_FrameLayout2
,_FrameLaoyt3
类它们只是复制/粘贴安口的的_FrameLayout
。
所以我略微改进了这种方法。我创建一个interface _FrameLayout
:
interface _FrameLayout {
// copy/paste from Anko's _FrameLayout
}
现在要支持任何自定义FrameLayout
子类,我只需要:
class _MyFrameLayout(ctx: Context) : MyFrameLayout(ctx), _FrameLayout
fun ViewManager.myFrameLayout(init: _MyFrameLayout.() -> Unit = {})= ankoView({ _MyFrameLayout(it) }, init)
创建许多自定义视图组时,这可以大大减少复制/粘贴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句