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

来源:互联网 发布:马爹利鼎盛干邑 知乎 编辑:程序博客网 时间:2024/05/29 17:15

    可视化一个控件(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;   //统计已经动态建立的节点个数@Overrideprotected 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:LinearLayoutLinearLayout 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的子控件:ButtonButton 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString input=countEdit.getText().toString();int count=Integer.parseInt(input);for(int i=0;i<count;i++){DynamicAddEditText(root);  //动态建立View,root是父节点}}});}//动态建立子控件 EditTextprivate 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
原创粉丝点击