动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)
前言:以前曾写过一篇关于动态生成控件的文章《动态添加控件及将某XML动态加入到Activity显示》,比较浅显,对于RelativeLayout的相关布局设置方法及相对布局与线性布局的混合使用的相关内容都没有进行深入讨论。今天再次涉及到这些内容,就不再单独讨论相对布局的相关设置内容了,直接从相对布局与线性布局的混合应用开始。
相关文章:《动态添加控件及将某XML动态加入到Activity显示》
总效果:
这里动态生成十个相同的列表,这是最终效果,但凡事都是从易而难的,下面我们就从XML生成一项内容开始讲解。
一、利用XML生成一项列表
这里先利用XML生成一项列表开始,先看一项列表的效果图及对应代码:
对应的XML代码为:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/layout_root"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- tools:context=".MainActivity" >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="#19000000"
- android:gravity="center_horizontal"
- android:paddingBottom="20dip"
- android:paddingTop="20dip"
- android:text="尝试动态生成列表"
- android:textColor="#ff0000"
- android:textSize="24sp" />
- <ScrollView
- android:layout_width="fill_parent"
- android:layout_height="match_parent"
- android:scrollbars="vertical" >
- <LinearLayout
- android:id="@+id/list_Lin"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <!-- 动态生成部分开始 -->
- <RelativeLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="5dip"
- android:layout_marginRight="10dip"
- android:layout_toLeftOf="@+id/image"
- android:background="#ff00ff00"
- android:orientation="horizontal"
- android:padding="5dip" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="我的第一次经历"
- android:textColor="#ff000000"
- android:textSize="20dip" />
- </LinearLayout>
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:clickable="true"
- android:padding="5dip"
- android:src="@drawable/plus" />
- </RelativeLayout>
- <!-- 动态生成部分结束 -->
- </LinearLayout>
- </ScrollView>
- </LinearLayout>
动态生成注释里的部分就是我们将要用代码生成的部分,这里写出来是为了在写代码时参考,现在把注释里的部分删掉,开始在代码中生成。
二、使用XML和JAVA代码生成界面
先贴出完整的代码,然后再逐步讲解。
完整代码:
- package com.example.trydynamiclayout;
- /**
- * write by harvic
- * 2014-4-25
- * http://blog.csdn.net/harvic880925
- */
- import android.os.Bundle;
- import android.app.Activity;
- import android.graphics.Color;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private static int id = 100;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- final LinearLayout lin = (LinearLayout) findViewById(R.id.list_Lin);
- LinearLayout.LayoutParams LP_FW = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- RelativeLayout newSingleRL=new RelativeLayout(this);
- for(int i=0;i<10;)
- {
- newSingleRL=generateSingleLayout(id,"第"+(++i)+"个动态列表");
- lin.addView(newSingleRL,LP_FW);//全部用父结点的布局参数
- }
- // final LinearLayout root = (LinearLayout) findViewById(R.id.layout_root); //获取总根结点
- // setContentView(root); //这里必须是总根结点
- }
- /**
- * 新建一个列表item
- * @param imageID 新建imageView的ID值
- * @param str TextView要显示的文字
- * @return 新建的单项布局变量
- */
- private RelativeLayout generateSingleLayout(int imageID,String str)
- {
- RelativeLayout layout_root_relative=new RelativeLayout(this);
- LinearLayout layout_sub_Lin=new LinearLayout(this);
- layout_sub_Lin.setBackgroundColor(Color.argb(0xff, 0x00, 0xff, 0x00));
- layout_sub_Lin.setOrientation(LinearLayout.VERTICAL);
- layout_sub_Lin.setPadding(5, 5, 5, 5);
- TextView tv = new TextView(this);
- LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- tv.setText(str);
- tv.setTextColor(Color.argb(0xff, 0x00, 0x00, 0x00));
- tv.setTextSize(20);
- tv.setLayoutParams(LP_WW);
- layout_sub_Lin.addView(tv);
- RelativeLayout.LayoutParams RL_MW = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
- RelativeLayout.LayoutParams.WRAP_CONTENT);//尤其注意这个位置,用的是父容器的布局参数
- RL_MW.setMargins(5, 5, 10, 5);
- RL_MW.addRule(RelativeLayout.LEFT_OF,imageID);
- layout_root_relative.addView(layout_sub_Lin,RL_MW);
- ImageView imageView = new ImageView(this);
- RelativeLayout.LayoutParams RL_WW = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
- RelativeLayout.LayoutParams.WRAP_CONTENT);
- imageView.setPadding(5, 5, 5, 5);
- RL_WW.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
- imageView.setLayoutParams(RL_WW);
- imageView.setClickable(true);
- imageView.setId(imageID);
- imageView.setImageResource(R.drawable.plus);
- layout_root_relative.addView(imageView);
- return layout_root_relative;
- }
- }
讲解:
一、先看generateSingleLayout(int imageID,String str)
1、看这段代码:
- RelativeLayout layout_root_relative=new RelativeLayout(this);
- LinearLayout layout_sub_Lin=new LinearLayout(this);
- layout_sub_Lin.setBackgroundColor(Color.argb(0xff, 0x00, 0xff, 0x00));
- layout_sub_Lin.setOrientation(LinearLayout.VERTICAL);
- layout_sub_Lin.setPadding(5, 5, 5, 5);
- TextView tv = new TextView(this);
- LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- tv.setText(str);
- tv.setTextColor(Color.argb(0xff, 0x00, 0x00, 0x00));
- tv.setTextSize(20);
- tv.setLayoutParams(LP_WW);
- layout_sub_Lin.addView(tv);
- RelativeLayout.LayoutParams RL_MW = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
- RelativeLayout.LayoutParams.WRAP_CONTENT);//尤其注意这个位置,用的是父容器的布局参数
- RL_MW.setMargins(5, 5, 10, 5);
- RL_MW.addRule(RelativeLayout.LEFT_OF,imageID);
- layout_root_relative.addView(layout_sub_Lin,RL_MW);
根据上面的XML可以,我们要首先生成一个RelativeLayout,这就是layout_root_relative。
注意一: (控件的布局参数选择方式)
然后生成其第一个字布局LinearLayout layout_sub_Lin;然后再生成layout_sub_Lin里唯一的一个控件,注意这里设置LayoutParams的方式,使用的是LinearLayout 参数!!!!对于如何选择当前控件的布局layout_width、layout_height的参数的方法,主要是看其父布局!!!!如果其父布局是LinearLayout 设置其LayoutParams参数时就要使用LinearLayout.LayoutParams,正如这里的TextView tv。而如果其父容器的相对布局呢,一样,换它父布局的来,使用RelativeLayout.LayoutParams RL_MW,如这里的LinearLayout layout_sub_Lin,所以即便layout_sub_Lin自己是布局控件也要按其父容器的布局方法写!!!!
注意二: layout_toLeftOf的代码书写方法
在XML中,对于此LinearLayout的相对布局,用到了android:layout_toLeftOf="@+id/image",而在代码中是动态生成的控件,如何利用此规则呢。
首先给动态生成的ImageView设置一个ID值,此ID值在些Acitivity中必须是唯一的,不可冲突的,如果冲突,关于用到此ID值的任何代码都将是无效的!这也就是后面代码中会看到的imageView.setId(imageID);
然后利用addRule()添加规则。
2、剩余代码就没什么好讲的了,就是生成一个imageView设置ID值及其它参数,然后添加到RelativeLayout中,并将layout_root_relative返回。
二、onCreate()函数
这段代码如下:
- final LinearLayout lin = (LinearLayout) findViewById(R.id.list_Lin);
- LinearLayout.LayoutParams LP_FW = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- RelativeLayout newSingleRL=new RelativeLayout(this);
- for(int i=0;i<10;)
- {
- newSingleRL=generateSingleLayout(id,"第"+(++i)+"个动态列表");
- lin.addView(newSingleRL,LP_FW);//全部用父结点的布局参数
- }
- final LinearLayout root = (LinearLayout) findViewById(R.id.layout_root); //获取总根结点
- setContentView(root); //这里必须是总根结点
1、先看For循环及其上部的代码:
- final LinearLayout lin = (LinearLayout) findViewById(R.id.list_Lin);
找到当前新生成的ITEM项的插入位置。
- LinearLayout.LayoutParams LP_FW = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- newSingleRL=generateSingleLayout(id,"第"+(++i)+"个动态列表");
- lin.addView(newSingleRL,LP_FW);//全部用父结点的布局参数
这里是两块代码,先看第二块,先是新生成一项,注意这一项返回的结点是RelativeLayout layout_root_relative,然后将其插入到列表位置中去,注意要插入的布局是LinearLayout lin,也就是layout_root_relative的父结点是LinearLayout,所以这也就是在addView时为什么它对应的布局参数使用LinearLayout.LayoutParams的原因了!
2、setContentView(root);显示视图
这段代码如下:
- final LinearLayout root = (LinearLayout) findViewById(R.id.layout_root); //获取总根结点
- setContentView(root); //这里必须是总根结点
这里最注意的一点,setContentView()所设置的视图结点是整个XML的根结点!!!!设置为其它结点会发生异常!!!很容易理解。
更正:
在原来的onCreate代码中,在代码的最后,加上了
- final LinearLayout root = (LinearLayout) findViewById(R.id.layout_root); //获取总根结点
- setContentView(root); //这里必须是总根结点
其实这样做是完全没有必要的,直接将这两句删除,效果是完全一样的。
原因在于,在其上面的代码中,我们通过
- final LinearLayout lin = (LinearLayout) findViewById(R.id.list_Lin);
找到了要插入布局的结点位置,直接在其下面插入布局代码,界面会自动更新,根本不需要重新setContentView()
在博客中,我将这两句无关代码注释了起来,而源码中没有更改过来,请大家注意一下,由于当时刚接触这部分,对大家造成的误导,深表歉意……
(源码中有两句代码完全不必要加,请看博客“更正”部分)
源码下载地址:http://download.csdn.net/detail/harvic880925/7250631,不要分,仅供分享!
三、完全使用JAVA代码生成UI界面
这部分其实在上面的改动不大,只是完全使用代码构建整个界面,由于这种方法构建UI可维护性很差,所以不推荐使用。
其它代码不变,OnCreate()函数代码如下:
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // setContentView(R.layout.activity_main);
- final LinearLayout lin = new LinearLayout(this);
- lin.setOrientation(LinearLayout.VERTICAL);
- LinearLayout.LayoutParams LP_FW = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- RelativeLayout newSingleRL=new RelativeLayout(this);
- for(int i=0;i<10;)
- {
- newSingleRL=generateSingleLayout(id,"第"+(++i)+"个动态列表");
- lin.addView(newSingleRL,LP_FW);//全部用父结点的布局参数
- }
- setContentView(lin); //这里必须是总根结点
- }
效果图:
该部分源码地址:http://download.csdn.net/detail/harvic880925/7692059
动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)相关推荐
- java layoutinflater_使用LayoutInflater动态加载布局和操作控件
我们知道在Android中通过布局文件来描述软件的界面,而通常在Activity中都是使用setContentView()来将布局显示出来.但是如果我们在非Activity的情况下,而且需要对布局中的 ...
- 动态添加控件及将某XML动态加入到Activity显示
一.动态添加控件.设置参数 这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的 ...
- Android 中动态的向布局中添加控件
先看一下效果图: 注: 这里使用的是一个自定义的布局文件,你可以向这个布局文件中添加任何控件,它也会动态的依据控件 的大小,动态的排列控件的分布 注:这里使用到的更新界面的方法:http://blog ...
- VB.net MenuStrip控件通过数据库生成多级动态菜单并添加单击事件
VB.net MenuStrip控件通过数据库生成多级动态菜单并添加单击事件 个人小白,一个多月前想通过 MenuStrip控件调用数据库数据生成多级联动下拉菜单,结果网上的资料都只是部分代码可用.经 ...
- 使用控件设计窗体 上 布局主窗体 添加标签与文本框控件
使用控件设计窗体 上 布局主窗体 添加标签与文本框控件 项目目标 所需控件 窗体基本设置 新建窗体 设置背景图片 设置平铺模式 设置icon 设置文字 修改名称 直接修改类名 标签控件与文本框控件 标 ...
- 利用Excel动态图表----------使用offset(),match()多种控件,实现筛选作图
实现利用Excel进行可视化动态分析. 如果想要进行实操,可从网盘中提取数据: 链接:https://pan.baidu.com/s/1rV_Cfx7kZqQvB7PzMqYHYA 提取码:aykp ...
- Excel 2010 VBA 入门 138 添加选项卡和内置控件
目录 题 码 功能区简介 使用Excel选项自定义功能区 题 在功能区中添加一个选项卡,并在选项卡中添加内置控件 码 使用Excel选项中的[自定义功能区]添加选项卡和内置控件. 步骤1 选择&qu ...
- 百度地图 添加工具条、比例尺控件
百度地图 添加工具条.比例尺控件 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-T ...
- 003 Android之线性布局与基础控件
文章目录 Android快速入门三步 布局介绍 LinearLayout布局属性 代码示例 基础控件 TextView和EditText 使用TextView与EditText ImageView I ...
最新文章
- Win7让你的程序变得更加漂亮,同样的程序在Win7操作系统下的效果对比
- 基于机器学习的web异常检测(转)
- libgdx学习记录18——Box2d物理引擎
- python实现表格合并_Python实现合并excel表格的方法分析
- OpenCASCADE:Modeling Algorithms模块几何工具之来自约束的线和圆
- dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程
- Spring Cloud 升级最新 Finchley 版本,踩了所有的坑
- python怎么写方程条件,条件方程曲线拟合
- 背包问题——01背包问题——饭卡
- 异常处理--“System.BadImageFormatException”类型的未经处理的异常在 DataTest.exe 中发生
- wpf之默认窗口模板研究
- Linux Shell脚本测试案例(一)
- python爬虫下一页_Python爬虫怎么获取下一页的URL和网页内容?
- [Luogu P4630] [BZOJ 5463] [APIO2018] Duathlon 铁人两项
- html百分比设置高度的原理,css height百分比 css高度百分比使用教程
- oracle分区详解
- 浏览器端反爬虫特征收集之字体检测
- C# vb .net实现玻璃桌子效果滤镜
- u盘提示格式化怎么修复教程
- 宁乡首届春耕节开幕,在寓教于乐中弘扬传统文化
热门文章
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Mixin 混合进行方法注入 )
- 【Android 逆向】Android 系统文件分析 ( /system/ 系统命令和系统应用数据目录 | /system/app/ 系统应用目录 | sys Linux 系统内核文件目录 )
- Linux系统的基本命令
- PHP手机号中间四位用星号*代替显示
- linux -- ./configure --prefix 命令
- Hadoop 资源列表
- 关于ASP.NET控件DropDownList控件的问题
- Matlab GUI 设计(4):不同控件之间的数据传递
- 实模式与保护模式详解一:寄存器
- AAAI 2019 | 借鉴传染病学原理探索医学图像CNN可解释性