在更高级的Android应用中,往往需要动态添加视图。要实现这样的功能,最重要的是获得被添加的视图所在的容器对象,这个容器对象所在的类需要继承ViewGroup类。通常这些容器视图被定义成XML布局文件的根节点,例如,<LinearLayout>、<RelativeLayout>等。
将其他的视图添加到当前的容器视图中需要如下几步:
1、获得当前的容器视图对象。
2、获得或创建待添加的视图对象。
3、将相应的视图对象添加到视图容器中。
假如有两个XML布局文件:test1.xml和test2.xml。这两个布局文件的根节点都是<LinearLayout>,下面的代码获得了test2.xml文件中的LinearLayout对象,并将该对象作为test1.xml文件中的<LinearLayout>标签的字节点添加到test1.xml的LinearLayout对象中。
//获得test1.xml中的LinearLayout对象
LinearLayout textLinearLayout1 = (LinearLayout)getLayoutInflater().inflate(R.layout.test1, null);
//将test1.xml中的LinearLayout对象设为当前容器视图
setContentView(testLinearLayout1);
//获得test2.xml中的LinearLayout对象,并将该对象添加到test1.xml的LinearLayout对象中
LinearLayout testLinearLayout2 = (LinearLayout)getLayoutInflater().inflate(R.layout.test2, testLinearLayout1);
其中inflate方法的第1个参数表示XML布局资源文件的ID,第二个参数表示获得容器视图对象后,要将该对象添加到哪个容器视图对象中。在这里是testLinearLayout1对象。如果不想将获得的容器视图对象添加到任何其他的容器中,inflate方法的第二个参数需要设为null。
除了上面的添加方式外,也可以使用addView方法向容器视图中添加对象,但要将inflate方法的第二个参数设为null,代码如下:
LinearLayout textLinearLayout1 = (LinearLayout)getLayoutInflater().inflate(R.layout.test1, null);
setContentView(testLinearLayout1);
LinearLayout testLinearLayout2 = (LinearLayout)getLayoutInflater().inflate(R.layout.test2, null);
testLinearLayout1.addView(testLinearlayout2);
除此之外,还可以完全使用Java代码创建一个视图对象,并将该对象添加到布局视图中,代码如下:
EditText editText = new EditText(this);
testLinearLayout1.addView(editText);
向布局视图添加视图对象时需要注意如下两点:
1、如果使用setContentView方法将容器视图设为当前视图后,还想向容器视图中添加新的视图或进行其他操作,setContentView方法的参数值应直接使用容器视图对象,因为这样可以向容器视图对象中添加新的视图。
2、一个视图只能有一个父视图,也就是说,一个视图只能被包含在一个容器视图中。因此,在向容器视图添加其他视图时,不能将XML布局文件中非根节点的视图对象添加到其他的容器视图中。例如:不能将testLinearLayout2.findViewById(R.id.textView2)获得的TextView对象添加到testLinearLayout1对象中,这是因为这个TextView对象已经属于test2.xml中的<LinearLayout>标签了,不能再属于test1.xml中的<LinearLayout>标签了。