前言
有点标题党了,但有一些坑其实也不是Anko本身的坑,Anko写布局其实就是用代码写布局,和以前的xml还是有一些区别的。
今天来说说这些坑( ps:今天只是讲用法,至于为什么各位自己Ctrl+鼠标左键点进去看源码 )
坑
- 相对布局的约束需指名id
relativeLayout {
val topView = textView {
}.lparams( MATCH_PARENT , dip(30f) )
textView {
}.lparams(MATCH_PARENT, MATCH_PARENT) { below(topView) }
}
从上面可以看看 下面的TextView在 topView下面,但是实际运行起来确不是这样。 难道是below()没用?
当然不是!!你需要给topView加个id,这样才行。
val topView = textView {
id = 0x12345
}.lparams( MATCH_PARENT , dip(30f) )
- activity里面 new 控件或者布局,用anko写一定报错
有人说我想用anko 额外的写个LinearLayout的,下面这样写行不行fun aaa() { .... val view = linearLayout { textView {}.lparams{} button {}.lparams{} } ....
}
```
运行起来就报错,什么原因,写的都是正确的啊。
前面原理的文章讲过了,你这个方法调用的是 Activity.linearLayout()。它会根据 上下文的对象,activity会setContextView(). 所以咱们得用Context的扩展方法
下面2中解决方法
val view = getContext().linearLayout { }
val view = UI { linearLayout { } }.view
- 用recycleView或者ListView,在adapter写每个item的布局时候,最外层的布局需指名LayoutParameter,看下面说明:
//在Activity,不要指名relativeLayout的LayoutParameter,它就是充满
onCreate(b:Builder) {
relativeLayout {
}
}
//在Adapter中
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): AHolder {
val rootView = kApplication.UI {
linearLayout {
//如果不指名最外层的linearLayout的LayoutParameter,默认的是item宽高度包裹内容
layoutParams = viewGroupLP(MATCH_PARENT, WRAP_CONTENT)
}
}
。。。
return AHolder(rootView)
}
- 用ViewPage的时候需设置id,不然会报如下错误:
看下面说明:
//在Activity,不要指名relativeLayout的LayoutParameter,它就是充满
onCreate(b:Builder) {
relativeLayout {
}
}
//在Adapter中
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): AHolder {
val rootView = kApplication.UI {
linearLayout {
//如果不指名最外层的linearLayout的LayoutParameter,默认的是item宽高度包裹内容
layoutParams = viewGroupLP(MATCH_PARENT, WRAP_CONTENT)
}
}
。。。
return AHolder(rootView)
}
网友评论