登录

去注册

登录

注册

去登录

注册

每日一问 自定义 ViewGroup 的时候,关于 LayoutParams 有哪些注意事项?

xiaoyang   2019-06-15   收藏

1. 可以考虑复写哪几个方法,各有什么作用。

2. 自定义 layout_ 属性等。

4

LayoutParams, 它的主要作用是用来协助ViewGroup进行布局的


在自定义ViewGroup过程中,如果需要定义我们自己的LayoutParams的话,

首先要创建一个类(通常为静态内部类),并继承自ViewGroup.LayoutParams或其子类(这个不用说)

ViewGroup需要重写的方法:

  • generateDefaultLayoutParams()
  • generateLayoutParams(ViewGroup.LayoutParams p)
  • checkLayoutParams(ViewGroup.LayoutParams p)


第一个, generateDefaultLayoutParams方法, 看名字就大概能猜到了: 生成默认的LayoutParams
这个方法会在 往ViewGroup中添加子View时被调用,如果该子View的LayoutParams为空,或者没有直接调用 有LayoutParams参数的addView方法的话。

第二个,在ViewGroup添加子View过程中,往往和第三个方法checkLayoutParams配合使用, 这个checkLayoutParams就是检查传进来的LayoutParams是否合法的,当然了,里面的逻辑是怎样的,就要看你怎么重写了,默认的实现是做个非空检查。如果检查到传进来的Params不合法的话,接着就会调用这个generateLayoutParams方法。

第三个方法, 虽然说你不重写,在一般情况下也不会报错,但还是建议重写,并且在里面判断这个传进来的Params,是不是你自己定义的Params。

-----------------------------------------------------------------------------

我们平时在xml里写布局时,通常会用到一些ViewGroup提供的属性, 比如FrameLayout的layout_gravity属性、LinearLayout的layout_weight等等。 可以发现,不同的ViewGroup它们所支持的属性也不同,这个其实也就是自定义的LayoutParams属性了,

那么我们要怎么去自定义LayoutParams属性呢?

首先,要在自定义的ViewGroup中重写一个generateLayoutParams(AttributeSet attrs)方法,等下可以从attrs中拿到各个子View所设置的属性。

接着,也是像自定义View属性那样,在attrs.xml中去定义一些需要用到的属性,这个styleable的命名格式一般为: "ViewGroup名_Layout"

最后,我们就可以回到LayoutParams中,找到有(Context c, AttributeSet attrs)这个参数的构造方法,在这里面就可以获取到子View中设置的属性了。

回复
nanchen2251 : @陈小缘 

补充一个。generateLayoutParams(AttributeSet attrs) 主要用于 inflate 处理

2019-07-09 回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定