您的位置:首页 > 移动开发 > Android开发

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

2015-06-23 18:46 661 查看
    可视化一个控件(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;
}
}



效果图如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息