Android中ViewGroup.Params整理总结

来源:互联网 发布:wordpress转zblog php 编辑:程序博客网 时间:2024/06/05 06:24

1.所有以”layout_”开头的属性都是属于LayoutParams或者LayoutParams的子类的,而不属于View的,但是在View绘制的measure或者其他过程中,会解析LayoutParams的属性,这样又影响到了View的绘制;

2.基类LayoutParams是ViewGroup类里的一个静态内部类,只提供了width和height两个属性,对应于xml里的layout_width和layout_height;
3.ViewGroup.MarginLayoutParams继承自ViewGroup.LayoutParams,只是比父类多了
        public int leftMargin;
        public int topMargin;
        public int rightMargin;
        public int bottomMargin;
        private int startMargin;
        private int endMargin;
       几个margin相关的属性。
        注意:在xml布局里,layout_margin属性的值会覆盖layout_marginLeft与layout_marginRight等属性的值。
4.如果自定义ViewGroup时想要支持Margin属性,还要扩展其他属性,那么最好继承并扩展ViewGroup.MarginLayoutParams。
5.为一个View创建LayoutParams的时候,最好创建View对应的父类LayoutViewGroup类型的LayoutParams,例如LinearLayout.LayoutParams,这样就可以得到LinearLayout的宽高、weight、gravity等属性,并进行设置。
   而不要只是创建一个ViewGroup.LayoutParams类型的对象,这样只会有宽高两个属性可用。

   如果确定只用到宽高这两个属性,那么也可以创建ViewGroup.LayoutParams类型的对象,这样不易产生LayoutParams类型不匹配的错误。

6.一般建议,用java添加view时,按照新建View、新建LayoutParams、为View设置LayoutParams、最后ViewGroup.addView(view)的顺序书写代码,这样ViewGroup会进行LayoutParams类型校验避免崩溃;
   如果按照新建View、新建LayoutParams、ViewGroup.addView(view)、最后为View设置LayoutParams的顺序书写代码,那么如果LayoutParams类型不匹配可能出现崩溃。因为最后为View设置LayoutParams完成后,ViewGroup会直接
   重绘刷新视图,不会校验LayoutParams类型,系统会有一步类型强制转换过程,有可能崩溃。

   并且,ViewGroup.addView(view),ViewGroup绘制了一次,然后再为View设置LayoutParams,ViewGroup又绘制了一次,性能较低,虽然系统会对重绘的流程有优化。

7.根据上述1、2、3、4、5条的描述,在java代码中,动态为view设置Params时,要新建该view对应的直接父布局类型的Params(如果只用到了宽高属性,新建ViewGroup.Param类型的也可以)。例如新建的TextView打算发到LinearLayout中,也就是TextView的直接父布局是LinearLayout,那么最好为TextView新建一个LinearLayout.Params对象,然后再为该TextView设置param参数;如果TextView的父布局是LinearLayout类型布局,那么如果为TextView新建的是RelativeLayout.Params类型或者FrameLayout.Params等其他类型的Param,那么有可能会导致程序崩溃(崩溃情况参考上述第6条描述)。

8.参考网址:
   http://blog.csdn.net/yisizhu/article/details/51582622
原创粉丝点击