Kotlin Anko自定义视图父范围

时间:2016-11-28 10:41:46

标签: android kotlin anko

如果我们要构建自定义视图,例如:

class FrameLayoutNormal: FrameLayout{
constructor(context: Context) : this(context, null)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {

    textView{
         lparams(...)
    }
}

我们无法定义lparams,因为编译器不知道父亲是谁。如果我们将textView包装在FrameLayout中,则它可以工作,并且您可以扫描指定布局参数。但在自定义视图中,父级本身就是。那么我们怎样才能让孩子们意识到这一点,以便我们可以使用扩展名?

除了从_FrameLayout

延伸之外,还有什么方法可以让它工作吗?

1 个答案:

答案 0 :(得分:0)

一个古老的问题,但是由于它很常见... 应用https://github.com/Kotlin/anko/issues/267

的答案

我认为您可能想要这样的东西:

class FrameLayoutNormal: AnkoComponent<Context> {
    override fun createView(ui: AnkoContext<Context>): View {
        return with(ui) {
            frameLayout {
                textView("Hello") {
                }.lparams()
            }
        }
    }
}

inline fun ViewManager.frameLayoutNormal(theme: Int = 0) = frameLayoutNormal(theme) {}
inline fun ViewManager.frameLayoutNormal(theme: Int = 0, init: View.(frameLayoutNormal: FrameLayoutNormal) -> Unit): View {
    val fln = FrameLayoutNormal()
    return ankoView({ fln.createView(AnkoContext.create(it))}, theme, {init(fln)})
}

这允许在ANKO DSL中使用该组件。这种方法的一个缺点是自定义组件是View,而不是ViewGroup,因此不能在其定义之外添加其他子项。制作自定义组件(可以用于ANKO DSL的ViewGroup)具有挑战性/艰巨性(如果我理解正确的话)。