Android应用开发—LayoutParams的用法

简介: Android应用开发—TextView的动态创建 这篇文章讲到了“TextView控件布局位置的控制”,主要依赖于RelativeLayout.LayoutParams的使用,本文简单介绍下LayoutParams的用法 注:本文大部分内容参考android,利用layoutParams代码动态布局空间位置和总结:代码中添加LinearLayout和RelativeLayout布局 或者是一份copy,之所以这里重新“写”一遍,主要是那篇文章的样式布局,实在有点不太好看。

Android应用开发—TextView的动态创建 这篇文章讲到了“TextView控件布局位置的控制”,主要依赖于RelativeLayout.LayoutParams的使用,本文简单介绍下LayoutParams的用法

注:本文大部分内容参考android,利用layoutParams代码动态布局空间位置总结:代码中添加LinearLayout和RelativeLayout布局 或者是一份copy,之所以这里重新“写”一遍,主要是那篇文章的样式布局,实在有点不太好看。

LayoutParams介绍:

LayoutParams继承于Android.View.ViewGroup.LayoutParams。LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉Layout用户期望的布局方式,也就是将一个认可的layoutParams传递进去。

可以这样去形容LayoutParams,在象棋的棋盘上,每个棋子都占据一个位置,也就是每个棋子都有一个位置的信息,如这个棋子在4行4列,这里的“4行4列”就是棋子的LayoutParams。

但LayoutParams类也只是简单的描述了宽高,宽和高都可以设置成三种值:

  • 一个确定的值。
  • MATCH_PARENT,即填满(和父容器一样大小)。
  • WRAP_CONTENT,即包裹住组件就好。
setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
                    LayoutParams.FILL_PARENT));

上面的代码其实是子对父的,也就是说,父布局下的子控件要设置这句话。
因为布局很多,虽然都继承至ViewGroup但是各个布局还是有很大的不同。
很显然上面这句应该这样写才算准确:

setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT,
                    TableRow.LayoutParams.FILL_PARENT));

这表示这个子控件的父布局是一个TableRow, 这样的LayoutParams 太多,所以应明确指明。

下面分别说下两个常用到布局:

  • FrameLayout下动态设置子控件居中,动态用JAVA代码要这样实现:
FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(80,LayoutParams.WRAP_CONTENT);
lytp.gravity = Gravity.CENTER;
btn.setLayoutParams(lytp);
  • RelativeLayout下动态设置子控件居中:
RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                            LayoutParams.WRAP_CONTENT); 
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); 
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 
btn1.setLayoutParams(lp);

在ANDROID 开发中,有时候我们需要在后台动态添加布局文件,这里我们来说一下后台添加LinerLayout布局和RelativeLayout文件的方式:

LinearLayout 布局:

线性布局,组件以垂直或水平方向线性排列。 android.widget.LinearLayout有个继承自android.view.ViewGroup.LayoutParams 的内嵌类LayoutParams,使用这个类的实例调用 LinearLayout.addView 就可以实现“线性布局”。

首先我们需要定义一个LinearLayout的布局参数params,如下:

  • 方式一:指定高、宽
LinearLayout.LayoutParams params = new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT,
                                    LayoutParams.WRAP_CONTENT)
  • 方式二:指定高、宽、权重,其中LayoutParams中的两个参数分别为:子控件的高、宽。
LinearLayout.LayoutParams params = new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT,
                                    LayoutParams.WRAP_CONTENT, weight)

设置控件相对于容器本身的位置:

LinearLayout.LayoutParams.gravity = 
Gravity.NO_GRAVITY/Gravity.TOP/Gravity.BOTTOM/Gravity.LEFT/Gravity.RIGHT

RelativeLayout布局:

RelativeLayout布局,是以“相对”位置/对齐为基础的布局方式。android.widget.RelativeLayout 有个继承自android.view.ViewGroup.LayoutParams 的内嵌类 LayoutParams,使用这个类的实例调用 RelativeLayout.addView 就可以实现“相对布局”。

首先我们需要定义一个 RelativeLayout的布局参数relLayoutParams,如下:

RelativeLayout.LayoutParams relLayoutParams=new RelativeLayout.LayoutParam(LayoutParams.FILL_PARENT,
                            LayoutParams.WRAP_CONTENT)

其中LayoutParams中两个参数分别为:子控件的宽(width),子控件的高(height),除了可以为LayoutParams.FILL_PARENT(android.view.ViewGroup.LayoutParams)等系统常量外还可以是数值,比如400。

  • 通过LayoutParams的 addRule方法来额外的添加别的规则:
android.widget.RelativeLayout.LayoutParams.addRule(int verb, int anchor)

其中 anchor 参数指定可以是 View 的 id(“相对于谁”)。RelativeLayout.TRUE(启用某种对齐方式)或者是-1(应用于某些不需要 anchor 的 verb)[因为 RelativeLayout.TRUE的值为 -1 ,所以-1或者RelativeLayout.TRUE都是可以是 0 (不启用这个规则)

其中 verb 参数指定相对的“动作”:
1. 如果是相对于父控件的相对布局的话 anchor 参数可以不用或者设置为-1或者RelativeLayout.TRUE。
2. 如果是相对于级别和自己同一级的控件的话参数设置应该是 view 的id。
3. 如果参数设置为 0 的话,则表示这个规则不会运用到该控件的布局中,当是相对于本身的父控件的时候这个参数可以省略。
eg:

relLayoutParams.addRule(RelativeLayout.ABOVE,imageViewId.getId())    
// 子控件相对于控件:imageViewId在其的上面
relLayoutParams.addRule(RelativeLayout.BELOW ,imageViewId.getId())  
// 子控件相对于控件:imageViewId在其的下面
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, -1) 与
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE) 与
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT )  
// 表示的是一样的表示子控件在父控件的右边
// 离某元素的左、上、右、下的距离单位
relLayoutParams.setMargins(arg0, arg1, arg2, arg3) relLayoutParams.topMargin=5

RelativeLayout的相关变量:

relLayoutParams.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
目录
相关文章
|
6天前
|
Java 调度 Android开发
深入解析Android应用开发中的响应式编程与RxJava应用
在现代Android应用开发中,响应式编程及其核心框架RxJava正逐渐成为开发者的首选。本文将深入探讨响应式编程的基本概念、RxJava的核心特性以及如何在Android应用中利用RxJava提升代码的可读性和性能。 【7月更文挑战第7天】
|
5天前
|
安全 Java Android开发
探索安卓应用开发中的Kotlin语言优势
【7月更文挑战第8天】 在安卓开发的广阔天地中,Kotlin以其优雅的语法、现代化的特性和高效的性能成为了开发者的新宠。本文将深入探讨Kotlin在安卓应用开发中所展现的独特魅力,从语言特性到实际应用案例,揭示其如何简化代码编写、提升开发效率,并增强应用性能。通过对比分析,我们将一同见证Kotlin如何在众多编程语言中脱颖而出,成为安卓开发领域的一股清新之风。
191 11
|
5天前
|
Java Android开发 开发者
探索安卓应用开发的未来:Kotlin语言的崛起与挑战
【7月更文挑战第8天】随着移动设备在人们日常生活中扮演着越来越重要的角色,安卓应用开发的技术趋势和编程语言选择对开发者来说变得至关重要。本文将深入探讨Kotlin语言如何成为安卓开发的首选,分析其带来的优势及面临的挑战,并预测其未来的发展方向。
|
3天前
|
开发工具 Android开发 iOS开发
探索iOS与安卓应用开发的差异及未来趋势
在移动操作系统的竞争中,iOS和安卓一直是两大巨头。本文深入探讨了这两个平台在开发环境、用户体验和市场趋势方面的不同点,并预测了未来可能的发展方向。通过比较分析,旨在为开发者提供有价值的参考,帮助他们根据项目需求和目标受众选择最适合的开发平台。
|
6天前
|
人工智能 物联网 Android开发
探索安卓应用开发的未来趋势
【7月更文挑战第7天】随着技术的不断进步,安卓应用开发领域正经历着前所未有的变革。从Kotlin的崛起到Flutter的跨平台能力,再到人工智能和机器学习的集成,开发者们面临着既激动人心又充满挑战的未来。本文将深入探讨这些趋势如何塑造未来的安卓应用开发,并讨论它们对开发者社区的意义。
|
9天前
|
存储 安全 Android开发
安卓应用开发的安全之道
【7月更文挑战第4天】在数字时代,移动应用的安全性至关重要。本文将深入探讨在安卓平台上开发安全应用的最佳实践,包括代码混淆、数据存储加密、网络通信安全、权限管理以及定期的安全审计和更新策略。通过这些措施,开发者可以显著提高他们的应用抵御恶意攻击的能力,保护用户数据免受侵害。
|
4天前
|
算法 数据库 Android开发
探索iOS与安卓应用开发的性能优化策略
在移动应用开发领域,性能优化是提升用户体验、增强应用市场竞争力的关键因素。本文深入探讨了iOS和安卓平台下,开发者如何通过具体技术和方法有效优化应用性能。文章首先概述了性能优化的重要性,随后详细分析了iOS和安卓开发中的优化策略,包括代码优化、资源管理和异步处理等技术手段。最后,通过案例分析,展示了这些优化措施在实际开发中的应用效果,旨在为开发者提供实用的性能提升建议。
|
4天前
|
XML Java Android开发
探索安卓应用开发:从新手到专家的旅程
【7月更文挑战第9天】在这篇文章中,我们将一起踏上一场激动人心的旅程,深入探索安卓应用开发的奥秘。不同于传统的技术文章,本文旨在以故事的形式,将读者带入一个软件开发者的成长之路,从最初的好奇和迷茫到最终成为领域内的专家。我们将一同经历学习编程语言、理解安卓架构、设计用户界面、实现功能逻辑以及优化性能等关键阶段,每一个步骤都充满了挑战与收获。通过这个旅程,你不仅会学到具体的技术知识,更会获得成为一名优秀开发者所必备的思维模式和解决问题的策略。
|
4天前
|
IDE Linux API
探索安卓应用开发:从新手到专家的旅程
【7月更文挑战第9天】本文旨在为初学者和有经验的开发者提供一个全面的安卓应用开发指南。我们将从基础概念开始,逐步深入到高级技术,并分享一些实用的开发技巧和最佳实践。无论你是刚开始接触安卓开发,还是已经有一定的经验,这篇文章都将为你提供有价值的信息和启发。
|
4天前
|
人工智能 搜索推荐 Android开发
安卓应用开发的未来趋势与挑战
【7月更文挑战第9天】在移动操作系统的竞技场上,安卓系统凭借其开放性、灵活性和广泛的用户基础,一直占据着举足轻重的地位。随着技术的不断进步和用户需求的日益多样化,安卓应用开发领域正迎来前所未有的发展机遇与挑战。本文将深入探讨安卓应用开发的最新趋势,分析面临的主要挑战,并展望未来的发展方向。