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源码:
为了深入了解XMlL视图可视化原理,通过Java代码,实现动态创建控件更新视图,Demo如下
效果图如下:
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; } }
效果图如下:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories