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
- Android学习第四课:Java代码动态创建View及LayoutParams类(二)
- android在java代码中动态添加组件及相关布局方法(LayoutParams)
- Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解
- Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解
- android视图类view及代码创建视图元件
- android.view.WindowManager.LayoutParams(上)
- WindowManager.LayoutParams//android.view
- Android View.ViewGroup.LayoutParams
- Android动态创建View
- android自定义View探索5(onMeasure深入分析二LayoutParams)
- LayoutParams继承于Android.View.ViewGroup.LayoutParams.
- LayoutParams继承于Android.View.ViewGroup.LayoutParams.
- LayoutParams继承于Android.View.ViewGroup.LayoutParams.
- Android学习第四课:Java代码实现XML布局
- java.lang.ClassCastException: android.view.ViewGroup$LayoutParams错误
- java.lang.ClassCastException: android.support.v4.view.ViewPager$LayoutParams
- android,利用layoutParams代码动态布局空间位置
- Android 利用layoutParams代码动态布局空间位置
- /mnt/asec /mnt/secure文件夹分区
- 约瑟夫环的数学推导、数学方法求最后出圈的数字、循环单链表求所有出圈数字顺序
- 第十四章,通过Intent打开其他软件(Android)
- 我的大学六年(单片机大师郭天祥原创)
- select加载数据和数据选中
- Android学习第四课:Java代码动态创建View及LayoutParams类(二)
- 使用HttpSessionListener接口监听Session的创建和失效
- 【Android杂谈】安卓手机与传感器通信
- Kafka剖析:Kafka背景及架构介绍
- android 返回本机安装的所有第三方应用
- 串行化(序列化) 使用CArchive进行读写
- Android studio使用git提交但是没有push,如何回退并保存
- 【线段树】 HDOJ 5274 Dylans loves tree
- DateTime