释放双眼,带上耳机,听听看~!

前言

大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致。

所以今天我们就来学习一些动态加添布局的两种方式,分别是

动态添加xml布局

另外写一个xml布局,然后通过java的方式让他加载他主布局上

动态添加java布局

通过java写出一个布局,然后再通过java的方式让他加载他主布局上

一、动态添加xml布局

步骤

第一步构造容器

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(

LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);

第二步构造xml文件

这里我们就主布局添加个button就可以了,用来点击加载xml布局,被添加布局里面我就写一个TextView,由于比较简单这里就不贴了

第三步构造LayoutInflater

提到addview,首先要了解一下LayoutInflater类。这个类最主要的功能就是实现将xml表述的layout转化为View的功能。为了便于理解,我们可以将它与findViewById()作一比较,二者都是实例化某一对象,不同的是findViewById()是找xml布局文件下的具体widget控件实例化,而LayoutInflater找res/layout/下的xml布局文件来实例化的。

而LayoutInflater有三种方式

LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);或

LayoutInflater inflater = LayoutInflater.from(Activity.this);或

LayoutInflater inflater = getLayoutInflater();

这三种方法本质是相同的。

第四步inflate()加载布局

用LayoutInflater.inflate() 将LayOut文件转化成VIew。

View view = inflater.inflate(R.layout.block_gym_album_list_item, null);

this.addContentView(view,lp);

关于第一步显示布局的详细介绍

改变布局主要是通过改变LayoutParams来实现的,LayoutParams继承于Android.View.ViewGroup.LayoutParams。它相当于一个Layout的信息包,封装了Layout的位置、高、宽等信息。需要注意的是,需要注意到要修改的View的父容器是什么类型的,FrameLayout,LinearLayout,RelativeLayout等,因为不同类型的LayoutParams是不同的。

上述代码与以下xml布局代码作用相同:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"/>

改变布局位置

addRule可传入不同的布局参数,如addRule(RelativeLayout.BELOW, R.id.XXX); 表示该View位于XXX下面。常用的布局参数有以下:

layoutParams.alignWithParent = true 如果对应的兄弟元素找不到的话就以父元素做参照物

RelativeLayout.CENTER_HORIZONTAL 在父控件中水平居中

RelativeLayout.CENTER_VERTICAL 在父控件中垂直居中

RelativeLayout.CENTER_IN_PARENT 相对于父控件完全居中

RelativeLayout.ALIGN_PARENT_BOTTOM 紧贴父控件的下边缘

RelativeLayout.ALIGN_PARENT_TOP 紧贴父控件的上边缘

RelativeLayout.ALIGN_PARENT_LEFT紧贴父控件的左边边缘

RelativeLayout.ALIGN_PARENT_RIGHT 紧贴父控件的右边缘

RelativeLayout.ABOVE 在某元素的上方 需要第二个参数为某元素的ID

RelativeLayout.BELOW 在某元素的下方 需要第二个参数为某元素的ID

RelativeLayout.LEFT_OF 在某元素的左边 需要第二个参数为某元素的ID

RelativeLayout.RIGHT_OF 在某元素的右边 需要第二个参数为 某元素的ID

RelativeLayout.ALIGN_TOP 本元素的上边缘和某元素的的上边缘对齐 需要第二个参数为某元素的ID

RelativeLayout.ALIGN_BOTTOM 本元素的上边缘和某元素的的下边缘对齐 需要第二个参数为某元素的ID

RelativeLayout.ALIGN_LEFT 本元素的上边缘和某元素的的左边缘对齐 需要第二个参数为某元素的ID

RelativeLayout.ALIGN_RIGHT 本元素的上边缘和某元素的的右边缘对齐 需要第二个参数为某元素的ID

RelativeLayout.ALIGN_BASELINE 本元素的基线和某元素的的基线对齐 需要第二个参数为某元素的ID

二、动态添加java布局

我们这里还是以TextView为例,其实动态添加java布局和xml布局有异曲同工之处,无非就是用java的方式写出控件,然后添加进布局里

第一步构造容器

和上面xml布局的一样,所以这里就不贴了

第二步构造控件布局框架

其实和xml的第二步也是一样的,只不过xml已经写好了最外层的布局,所以我们也要用java写出一个布局,好在里面放控件

LinearLayout view = new LinearLayout(this);

view.setLayoutParams(lp);//设置布局参数

view.setOrientation(LinearLayout.HORIZONTAL);// 设置子View的Linearlayout// 为垂直方向布局

//定义子View中两个元素的布局

ViewGroup.LayoutParams vlp = new ViewGroup.LayoutParams(

ViewGroup.LayoutParams.WRAP_CONTENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

第三步添加控件

其实这一步也没有什么好讲的,就是xml添加控件的方式改成java添加

TextView tv1 = new TextView(this);

tv1.setLayoutParams(vlp);//设置TextView的布局

tv1.setText("姓名:");

第四部将控件添加至容器

view.addView(tv1);//将TextView 添加到子View 中

android动态居中布局,Android动态添加布局的两种方式相关推荐

  1. java jframe添加面板_JFrame添加组件的两种方式

    对JFrame添加组件有两种方式:1) 用getContentPane()方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childCompont ...

  2. android通用listview和gridview万能适配器实现的两种方式

    Listview和gridview是超级常用组件,于是乎,应该封装一下直接拿来用用而不是每次都写Adapter,这样多么的麻烦是不.虽然国内外大牛都有封装过,但是我总结了两个封装好的Adapter分享 ...

  3. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  4. Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  5. Android获取短信验证码并自动填充的两种方式

    有些项目为了方便客户操作,减去客户输入短信验证码的时间,会要求安卓app能够获取收到的短信验证码并自动填充到输入框.所以,我整理了安卓获取短信验证码并自动填充输入框的两种方法,而且正式在项目中使用并无 ...

  6. 给TextView中的部分文本添加链接的两种方式

    方式一:在布局文件中给TextView制定autoLink属性,例如: <TextView android:id="@+id/tv2"android:layout_width ...

  7. 给ImageView 添加阴影的两种方式

    1.通过设置背景图 background <ImageView                         android:id="@+id/img_cover"     ...

  8. android 手机,连接蓝牙耳机连接不成功;两种方式都连接失败

    第一种连接方式,使用反射类,连接不成功: Method m = null;                                 try {                          ...

  9. Debian添加自启动的两种方式

    前言 本教程是基于Debian 9进行测试,其他版本暂未测试 第一种 把脚步放在/etc/profile.d/下面即可 第二种 ps:由于Debian高版本没有/etc/rc.local文件 但功能还 ...

  10. JS 添加属性的两种方式

    let a = [{ name: '羽神' },{ name: '少主' },{ name: '刘备' },{ name: '关于' } ] for (const key in a) {a[key]. ...

最新文章

  1. C#:String.Format数字格式化输出
  2. 使用Google Closure DepsWriter生成JS依赖文件(二)
  3. NIO介绍与Netty通信简单入门
  4. 基于混沌的图像置乱加密算法及matlab的实现,基于混沌的图像置乱加密算法及MATLAB的实现...
  5. Netty 客户端服务器端通信 demo
  6. python私有仓库_创建git私有仓库
  7. 我的超休闲游戏作品集
  8. JS 在线格式化工具
  9. vbm 分析_vbm8_r435 脑功能数据分析处理实用软件,基于SPM 来运行 matlab 238万源代码下载- www.pudn.com...
  10. FQQ兵法,适用于各种版本以及种族
  11. Python Behave框架学习
  12. 区块链系统:点对点交易原理
  13. 简单表单提交php教程,php教程之表单提交实例
  14. 台积电版的骁龙8G1+即将发布,参数惊人,但是骡子是马得遛遛再说
  15. 烤仔万花筒 | Bounty v2.0公测版上线
  16. pandas数据分析给力教程【完整版】(五)
  17. Windows开机自启动jar包
  18. 获取电脑cpu,硬盘,网卡序列号
  19. Routeros封Vagaa教程(转)
  20. 机器学习_经典模型_SVM(支持向量机)

热门文章

  1. 谷歌插件开发ajax请求,chrome插件 注入js以及发送ajax(message/request)
  2. oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?
  3. canal mysql从库_canal中间件|数据增量同步解决方案
  4. laravel 判断字符串包含_laravel 字符串操作大全
  5. 美团差评数据分析,python代码实现
  6. 清华镜像源安装 NGboost XGboost Catboost
  7. NeurIPS 2020 所有RL papers全扫荡
  8. Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】
  9. 最全BAT前端开发面试80题:算法+html+js+css!含答案大赠送!
  10. Kubernetes 1.20 版本开始将弃用 Docker,是时候拥抱 Containerd 和 Podman 了!