Android应用开发—LayoutParams的用法

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
上一篇:Android应用开发—数据更新问题的思考


下一篇:微信小程序开发者注册流程