Android学习第四课:Java代码动态创建View及LayoutParams类(二)

    可视化一个控件(View或ViewGroup),关键是对控件属性进行设置,以确保控件能够正确显示。控件的属性可以分为两类,一类是控件本身自有属性,可以通过View.setXXX或ViewGroup.setXXX进行设置;还有一类属性是控件向其父控件传递的,主要是告知父控件其自身的width,height,这些是通过ViewGroup的静态内部类View.ViewGroup.LayoutParams进行设置的,即LayoutParams(width,height)。


    LayoutParams基类简介
    
LayoutParams是ViewGroup的静态内部类,VIew或ViewGroup利用LayoutParams向其父控件传递Size信息,让父控件能够为其分配合适的Size。LayoutParams基类只能描述View期望的width/height信息,width/height信息有三种模式:FILL_PARENT/match_patent,wrap_content,an exact number。继承LayoutParams的布局控件可以传递更多信息,比如AbsoluteLayout增加了 X and Y value,LinearLayout增加了weight参数。

    LayoutParams源码:


<pre name="code" class="java">public static class LayoutParams {


    //传递Size模式
    public static final int FILL_PARENT = -1;
    public static final int MATCH_PARENT = -1;
    public static final int WRAP_CONTENT = -2;


    //View向其父控件传递的宽高信息
    public int width; public int height;


    //创建一系列的parameters,parameters值是通过Context、AttributeSet获取的
        public LayoutParams(Context c, AttributeSet attrs) {
            TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
            setBaseAttributes(a,
                    R.styleable.ViewGroup_Layout_layout_width,
                    R.styleable.ViewGroup_Layout_layout_height);
            a.recycle();
        }


    //传递宽高信息
        public LayoutParams(int width, int height) {
            this.width = width;
            this.height = height;
        }
    //复制source信息
        public LayoutParams(LayoutParams source) {
            this.width = source.width;
            this.height = source.height;
        }
}


 

    为了深入了解XMlL视图可视化原理,通过Java代码,实现动态创建控件更新视图,Demo如下

<pre name="code" class="java">package com.example.dynamicaddview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
	
	private static int countOfEdit=0;   //统计已经动态建立的节点个数

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main);
		
		final LinearLayout root=new LinearLayout(this);
		root.setOrientation(LinearLayout.VERTICAL);  //设置控件固有属性
		
		//XML中的根控件是系统的子控件,故需要通过LayoutParams设置其相对于系统的宽、高属性
		ViewGroup.LayoutParams  rootParams=new LayoutParams(
				ViewGroup.LayoutParams.MATCH_PARENT, 
				ViewGroup.LayoutParams.MATCH_PARENT);		
		root.setLayoutParams(rootParams);		
		setContentView(root);    //类似加载XML文件
		
		//设置根控件的子控件child0:LinearLayout
		LinearLayout child0OfRoot=new LinearLayout(this);
		LinearLayout.LayoutParams child0OfRoot_params=new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.MATCH_PARENT,
				LinearLayout.LayoutParams.WRAP_CONTENT);
		child0OfRoot.setLayoutParams(child0OfRoot_params);
		
		child0OfRoot.setOrientation(LinearLayout.HORIZONTAL);
		root.addView(child0OfRoot,0);  //将linearlayout添加到root下
		

		//设置child0的子控件:EditText
	    final EditText countEdit=new EditText(this);
		countEdit.setHint("请输入添加控件数量");
		LinearLayout.LayoutParams countEdit_params=new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.MATCH_PARENT,
				LinearLayout.LayoutParams.WRAP_CONTENT,
				1);
		countEdit.setLayoutParams(countEdit_params);
		child0OfRoot.addView(countEdit,0);
		
		//设置child0的子控件:Button
		Button countButton=new Button(this);
		countButton.setText("添加");		
		LinearLayout.LayoutParams countButton_params=new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT,
				0);
		countButton.setLayoutParams(countButton_params);
		child0OfRoot.addView(countButton,1);
		
		countButton.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String input=countEdit.getText().toString();
				int count=Integer.parseInt(input);
				
				for(int i=0;i<count;i++){
					DynamicAddEditText(root);  //动态建立View,root是父节点
				}
			}
		});		
	}
	
	
	//动态建立子控件 EditText
	private EditText DynamicAddEditText(ViewGroup parent){
		
	    EditText edit=new EditText(this);		    
	    //这段代码没有问题,可以被下面的替代
/*		LinearLayout.LayoutParams countEdit_params=new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.MATCH_PARENT,
				LinearLayout.LayoutParams.WRAP_CONTENT
				);*/
	    
	    //LayoutParams是ViewGroup的内部静态类,继承ViewGroup的布局类基本继承该内部类,没做改动
		LayoutParams countEdit_params=new LayoutParams(
				LayoutParams.MATCH_PARENT,
				LayoutParams.WRAP_CONTENT
				);
		
		edit.setLayoutParams(countEdit_params);		
		parent.addView(edit,countOfEdit+1);
		
		countOfEdit++;
		edit.setText("第"+countOfEdit+"个动态建立的editText");		
		return edit;
	}
}

 


效果图如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值