Anko Layout DSL:如何使用已有的布局?

Anko Layout DSL: How to use already existing layout?

我的问题专门与 constrainLayout { ... } 有关,但由于 Anko Layout 并不关心它适用于每个 Layout

我能做到:

// Could also be verticalLayout { ... } or any other Layout
constraintLayout {
    // some layout logic e.g.
    view {
        // ...
    }.lparams {
        // ...
    }
}

现在我遇到了一个问题,因为 this DSL 创建了一个新的 ConstraintLayout,但我想对现有的 ConstraintLayout 执行相同的逻辑。我正在搜索类似“dsl”函数的内容,但我在文档或其他任何地方都找不到任何内容。

ConstraintLayout(this).dsl {
    // ...
}

applyRecursively { ... }函数,被标记为AnkoViewDslMarker的类使用,即在布局DSL中,但不标记"my already existing ConstraintLayout"和因此我无法使用任何 DSL 功能。

所以也许一个简单的解决方案是用 annotation class 标记我的对象,但我怀疑这是否有效,因为我同时使用 XML,其中 "my already existing ConstraintLayout" 也来自。我希望有人知道如何用 Anko 做到这一点。否则我将不得不提出一个问题 :)

这很可能是您需要的 ankoView(...) { ... } 函数,它允许您使用作为第一个参数传递的函数提供的任意视图,其方式与 Anko 原生支持的视图相同。

在此处查看其说明:Is it extensible?

鉴于您已有 constraintLayout,您可以这样做:

ankoView({ constraintLayout }) { 
    // Inner DSL scope for constraintLayout
}

我通过创建一个扩展函数解决了 ConstraintLayout "lparams",然后我可以使用 就像 DSL:

inline fun View.constraintLparams(width: Int, height: Int, init: LayoutParams.() -> Unit) {
    val layoutParams = LayoutParams(width, height)
    layoutParams.init()
    this.layoutParams = layoutParams
}