简析Android 动态添加控件的几种方式

在某些情况下我们会有让用户自行添加控件的需求,本文主要通过addView来实现

1.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这个方法,可其实还有更加简便的方法。

2.获取添加控件的实例

在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从而获取到控件的实例

3.移除控件

// 从LinearLayout 中移除Button 1
   linear. removeView ( b1 );

4.动态添加xml布局 

 到此为止我们已经知道了怎么动态创建控件了,但是小伙伴你有没有发现这样一个一个的添加控件太麻烦了呢,有没有办法可以直接实现动态添加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

 

 

 

你可能感兴趣的:(简析Android 动态添加控件的几种方式)