在某些情况下我们会有让用户自行添加控件的需求,本文主要通过addView来实现
首先让我们来看一下源码
void android.view.ViewGroup.addView(View child);
void android.view.ViewGroup.addView(View child, LayoutParams params);
void android.view.ViewGroup.addView(View child,int index, LayoutParams params);
可以看到该方法接收三个参数1.视图 2.索引 3.视图的位置信息
再来看第二个参数,它是容器内部子视图数组的索引位置,默认<0视图将添加到容器(布局)的尾(底)部,
举个例子 vertical 属性的 LinearLayout 的内部有两个按钮它们的索引分别为0,1
视图index为0时将取代第一个按钮居容器的顶部,index为1时视图将会居两按钮的中间(此时第二个按钮索引为2)
第三个参数是视图的位置使用LayoutParam类来实现,一般用于在动态添加容器的基础上继续添加子视图,下面给出示例
RelativeLayout relative = new RelativeLayout(this);//获取容器实例
linear.addView(relative);
relative.setBackgroundColor(Color.YELLOW);
// 将Button1 加入到RelativeLayout 中
Button btn_r1 = new Button(this);//获取View实例
btn_r1.setText("取消");//设置显示的字符
btn_r1.setId(24);//设置控件id
RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT
, LayoutParams.WRAP_CONTENT);//获得对应父窗体类型的LayoutParams
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); //紧贴父控件的右边边缘
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);//紧贴父控件的顶部边缘
relative.addView(btn_r1, lp);
关于LayoutParam这里不再赘述请移步网页链接
好了,我们现在已经成功动态创建了控件,但是我们怎么获取到这个控件的实例呢?相信有细心的小伙伴已经看到了setId这个方法,可其实还有更加简便的方法。
在Activity中
class MainActivity extends Activity implements OnClickListener
mbtn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View p1)
{
// TODO: Implement this method
TextView tv=new TextView(MainActivity.this);
tv.setOnClickListener(MainActivity.this);
id++;
tv.setText("示例文本框" + id);
tv.setId(id);
linear.addView(tv, 1);
}
});
可以看到这里我们的id并没直接指定某一个数值 ,并且设置了控件的监听,那么我们可以
@Override
public void onClick(View p1)
{
// TODO: Implement this method
TextView tv= findViewById(p1.getId());
Toast.makeText(MainActivity.this, "你点击了" + tv.getText(), Toast.LENGTH_SHORT).show();
}
通过点击添加的文本视图来获取到id从而获取到控件的实例
// 从LinearLayout 中移除Button 1
linear. removeView ( b1 );
到此为止我们已经知道了怎么动态创建控件了,但是小伙伴你有没有发现这样一个一个的添加控件太麻烦了呢,有没有办法可以直接实现动态添加xml布局呢?关于xml你想到什么了呢,没错自定义控件,接下来我们就通过LayoutInflater.from().inflate()方法来实现
View v1 =LayoutInflater.from(context).inflate(R.layout.CodeView,null,false);
//获取视图,其中R.layout.CodeView是xml布局
v.addView(v1);
//添加视图v1到容器v