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