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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但如果我将myFrameLayout调用更改为frameLayout它就可以了.那么,什么是使视图组与Anko DSL一起使用的正确方法?
实际上你只需要扩展anko并声明你的自定义视图然后通常在DSL中使用它:
public inline fun ViewManager.customView() = customView {}
public inline fun ViewManager.customView(init: CustomView.() -> Unit) = ankoView({ CustomView(it) }, init)
Run Code Online (Sandbox Code Playgroud)
然后通常在DSL中使用它
frameLayout {
customView()
}
Run Code Online (Sandbox Code Playgroud)
如果我们看一下 Anko 源代码,我们可以看到它frameLayout实际上返回一个_FrameLayout类的实例,其中lparams定义了这些函数。据我了解,这是必要的,因此这些lparams函数仅在布局构建代码中可用。
在 Anko 的Layouts.kt文件中,_<ViewGroup>每个受支持的ViewGroup.
因此,支持自定义视图组的直接方法是创建一个_<ViewGroup>具有方法实现的类lparams。问题是这个_<ViewGroup>类通常包含比我本身更多的代码<ViewGroup>!
如果我想创建许多自定义视图组,那么为它们添加 Anko 支持就会成为这种方法的一大痛苦。假设我有MyFrameLayout1, MyFrameLayout2,MyFrameLayout3课程。它们基本上是FrameLayout的,所以我希望与它们一起使用相同的布局参数。但我必须创建_FrameLayout1, _FrameLayout2,_FrameLaoyt3类,它们只是 Anko 的复制/粘贴_FrameLayout。
所以我稍微改进了这个方法。我创建一个interface _FrameLayout:
interface _FrameLayout {
// copy/paste from Anko's _FrameLayout
}
Run Code Online (Sandbox Code Playgroud)
现在要支持任何自定义FrameLayout子类,我只需:
class _MyFrameLayout(ctx: Context) : MyFrameLayout(ctx), _FrameLayout
fun ViewManager.myFrameLayout(init: _MyFrameLayout.() -> Unit = {})= ankoView({ _MyFrameLayout(it) }, init)
Run Code Online (Sandbox Code Playgroud)
在创建许多自定义视图组时,这会大大减少复制/粘贴的次数。
| 归档时间: |
|
| 查看次数: |
3356 次 |
| 最近记录: |