如果我们要构建自定义视图,例如:
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
?
答案 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)具有挑战性/艰巨性(如果我理解正确的话)。