如何将自定义视图组添加到Anko DSL?

net*_*men 8 kotlin anko

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一起使用的正确方法?

Eef*_*ret 6

实际上你只需要扩展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)


net*_*men 0

如果我们看一下 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)

在创建许多自定义视图组时,这会大大减少复制/粘贴的次数。