动态添加 view

来源:互联网 发布:php应用 编辑:程序博客网 时间:2024/06/05 21:13

LayoutParams

在学自定义View的时候,我对LayoutParams已经有了一些了解,这里总结一下
子View持有LayoutParams类型的对象,这个对象用来告诉父View——子View希望被如何放置
对于静态添加的View,系统解析xml文件,并调用父View的generateLayoutParams方法生成一个LayoutParams对象,把这个对象设置给子View
对于动态添加的View,需要手动指定LayoutParams对象,这里需要注意:
子View持有的LayoutParam对象的类型必须与父View的generateLayoutParams方法生成的对象相同,这样才可以使用所有的父View支持的LayoutParams属性
如果仅仅是想设置View的大小,也可以直接使用ViewGroup.LayoutParam,它是所有LayoutParam的基类

动态添加View的注意事项

最简单的动态添加View的例子

View view= getLayoutInflater().inflate(R.layout.phone_item, viewGroup);
  1. 首先需要获得父布局,要保证获得的父View对象的唯一,不能多次使用LayoutInflater.inflate方法生成多个父View对象,只能生成一个,或者是使用findViewbyId
  2. 如果需要添加的 view 对象比较简单,那可以直接 new 一个,而不需要使用LayoutInflater().inflate方法,然后使用 layout.addView() 方法添加
  3. LayoutParams可以在ViewGroup对象的addView方法中设置,也可以使用View对象的setLayoutParams方法设置

LayoutInflater

可以直接在Activity中getLayoutInflater()获得LayoutInflater对象,或者调用它的静态方法LayoutInflater.from(context)来获得,这两种方法效果相同
LayoutInflater对象的inflate方法可以解析xml并生成相应的对象,这里只讲根据resId来生成对象的方法
inflate(int resource, ViewGroup root)
inflate(int resource, ViewGroup root, boolean attachToRoot)
这三个参数分别是:要解析的xml文件的id,父View,是否要把解析完成的View添加给父View
第一个方法也是调用了第二个方法,它根据父View是否为null,来选择attachToRoot的值
这两个方法的返回值都是View,原则是root不是null,且attachToRoot为true,则返回父View,否则返回解析的xml文件的最外层View,简单的说就是判断解析的View是不是依附到了一个父View
一般有三种使用组合

(view, null) 同(view, null,false)
有父View,所以它仅仅是解析xml文件,返回View,如果不再为返回的View设置LayoutParams,那当它被添加进ViewGroup时,所有LayoutParams的xml属性都不起作用(宽高自动设置为wrap_parent

(view, parent, false)
解析xml文件,但是不要把它附加到parent上,所以此时的parent的作用仅仅是提供LayoutParams
最好让parent的类型与view将被添加到的父View的类型相同,这样才有相同的LayoutParams类型

(view, parent) 同 (view, parent, true)
解析xml,并附加到parent上,用这种方法的话后面就不需要使用ViewGroup对象的addView方法来添加了