Android开发如何布局(AddView和layoutParams如何使用)
一、AddVIew
addview方法可以用于动态地向布局内添加view
addview重载了五个方法,如下所示
addView(View child) // child-被添加的View addView(View child, int index) // index-被添加的View的索引 addView(View child, int width, int height) // width,height被添加的View指定的宽高 addView(View view, ViewGroup.LayoutParams params) // params被添加的View指定的布局参数 addView(View child, int index, LayoutParams params)
1.addView(View child)
以linearlayout为例,直接往索引为index的地方添加view。如图所示
2.addView(View child, int index)
这样一来这个方法就很好理解了,直接往指定索引的地方添加view。如图所示
3.addView(View child, int width, int height)
和addView(View view) 类似,默认在index的位置放入一个view,唯一区别在于可以控制view的宽高。
TextView newTextView=new TextView(this);
LinearLayout linearLayout=findViewById(R.id.container);
newTextView.setBackgroundColor(getResources().getColor(R.color.colorAccent));
linearLayout.addView(newTextView,200,200);
效果如图所示
4.addView(View view, ViewGroup.LayoutParams params) // params被添加的View指定的布局参数
通过设置LayoutParams属性,可以设置控件的更多更多样的布局属性。
关于LayoutParams会另外开一篇文章进行更加详细的记录。
5.addView(View child, int index, LayoutParams params)
和上面的方法基本类似,此外还能指定出现的index层级
6.index在不同布局中的意义
1 linearlayout 根据所设置的orientation的方向排列
2 relativelayout 呈现堆叠的方式,index越大,越在别的控件的上方
3 framlayout 同relativelayout
4 ConstraintLayout还没测试,目前还不会约束布局的动态添加。以后会了再补这个坑
二、layoutParams
LayoutParams
在动态添加view的过程中,需要指定被添加的view在parent中的一些布局参数,比如宽高,比如位置信息等。
1.ViewGroup.LayoutParams
作为最基本的layoutparams 只需要描述子view的宽高即可,它的值可以被设置为 Fill_parent(API8之后 改名),MATCH_PARENT或者具体的某个值。
成员变量
height 指定高度
width 指定宽度
layoutAnimationParameters 设置用于布局的动画。
构造方法
LayoutParams(Context c, AttributeSet attrs)
根据上下文和传入的AttributeSet创建布局参数,它们被映射到xml文件中就变成了layout_width与layout_height。
LayoutParams(int width, int height)
根据宽高指定布局参数
LayoutParams(ViewGroup.LayoutParams source)
直接从源参数复制一份
公有方法
public void resolveLayoutDirection (int layoutDirection)
根据布局的方向解析布局参数,关注布局方向改变的子类应该重写这个方法。现在是空实现。layoutDirection有两个值,分别是View#LAYOUT_DIRECTION_LTR 水平从左向右
View#LAYOUT_DIRECTION_RTL 水平从右向左
受保护的方法
protected void setBaseAttributes (TypedArray a,
int widthAttr,
int heightAttr)
根据被提供的属性,提取出属性参数
2.MarginLayoutParams
继承自ViewGroup.LayoutParams,除了以上提到的属性以外,还可以设置margin。
映射到xml中,提供了以下的属性
android:layout_margin 四周
android:layout_marginBottom
android:layout_marginEnd
android:layout_marginHorizontal 水平
android:layout_marginLeft
android:layout_marginRight
android:layout_marginStart
android:layout_marginTop
android:layout_marginVertical 竖直
这里主要讲述一下marginStart与marginLeft的区别(marginEnd与marginRight同理)
布局有两种布局方式,分别是上面所提到的
View#LAYOUT_DIRECTION_LTR 水平从左向右
View#LAYOUT_DIRECTION_RTL 水平从右向左
当所采取的布局使用的是LAYOUT_DIRECTION_LTR时,marginStart和marginLeft没有区别,如果使用的是LAYOUT_DIRECTION_RTL,则marginLeft和marginStart正好相反。换句话说也就是,marginStart根据布局方向的方向,设置距离开始参照物的margin,而marginLeft则是一个固定方向,即用户所在的左手方向作为margin的参照物。
成员变量
public int bottomMargin
public int leftMargin
public int rightMargin
public int topMargin
即上下左右的margin
构造方法
相较于它的父类,多了一个可以根据MarginLayoutParams创建布局参数的一个构造方法
公有方法
int getLayoutDirection()
返回布局方向,所有布局默认是0 左到右
int getMarginEnd()
int getMarginStart()
boolean isMarginRelative()
查看margin是否是相对的,如果设置了marginStart或者marginEnd 则返回true
void resolveLayoutDirection(int layoutDirection)
此方法会被 View.requestLayout()所调用。根据布局方向,左右margin可能会被覆盖
void setLayoutDirection(int layoutDirection)
设置layoutdirection
void setMarginEnd(int end)
设置相对的marginEnd
void setMarginStart(int start)
设置相对的marginStart
void setMargins(int left, int top, int right, int bottom)
设置四个margin
直接继承的有 FrameLayout.LayoutParams,LinearLayout.LayoutParams, RelativeLayout.LayoutParams(其实还有别的,但本文主要讲述这三个布局下的布局参数)
3.LinearLayout.LayoutParams
成员变量
public int gravity gravity指定了一个控件如何放在父布局中。
对应的xml中android:layout_gravity,下方是它可以设置的值。
Constant | Value | Description |
---|---|---|
bottom | 50 | 将控件放在父布局的底部,不改变其大小 |
center | 11 | 将控件放在父布局水平与竖直方向的中心,不改变大小 |
center_horizontal | 1 | 将控件放在父布局水平方向的中心,不改变大小 |
center_vertical | 10 | 将控件放在父布局竖直方向的中心,不改变大小 |
clip_horizontal | 8 | 可以设置为将子对象的左边缘和/或右边缘剪裁到其容器边界的附加选项。剪辑将基于水平重力:左重力将剪辑右边缘,右重力将剪辑左边缘,两者都不会剪辑两条边。(不明白作用?) |
clip_vertical | 80 | 同上,竖直方向。 |
end | 800005 | 将控件放在父布的尾部,不改变大小 |
fill | 77 | 填充父布局 |
fill_horizontal | 7 | 水平方向填充父布局 |
fill_vertical | 70 | 竖直方向填充父布局 |
left | 3 | 将控件放在父布局的左边,不改变大小 |
right | 5 | 将控件放在父布局的右边,不改变大小 |
start | 800003 | 将控件放在父布局的开始位置,不改变大小 |
top | 30 | 将控件放在父布局的上边,不改变大小 |
public float weight
描述了父布局余下空间应该被分配多少给该view。如果不想获取额外空间设置为0,否则和所有大于0的子view按照权重对剩余空间进行分配。
构造方法
和MarginLayoutParams 相较多了一个可以根据LinearLayout.Params创建布局参数的构造方法
公有方法
String debug(String output)
文档中没有对方法进行解释,查看源码可以看到
@Override
public String debug(String output) {
return output + "LinearLayout.LayoutParams={width=" + sizeToString(width) +
", height=" + sizeToString(height) + " weight=" + weight + "}";
}
是返回了一个拼接的字符串,包含了输入值,布局参数的宽高一级weight
4.FrameLayout.LayoutParams
成员变量
public int gravity
对应android:layout_gravity,默认值是常量UNSPECIFIED_GRAVITY,相当于Gravity.TOP | Gravity.START
构造方法
和MarginLayoutParams 相较多了一个可以根据FrameLayout.LayoutParams 创建布局参数的构造方法
5.RelativeLayout.LayoutParams
xml属性
XML attributes | |
---|---|
android:layout_above | 将view放在给定id的view上方 |
android:layout_alignBaseline | 将view的基线放在给定id的view 的基线上 |
android:layout_alignBottom | 将view的下边缘与给定id的view 的下边缘对齐 |
android:layout_alignEnd | 同上,只是对齐的是尾边缘 |
android:layout_alignLeft | 同上,只是对齐的是左边缘 |
android:layout_alignParentBottom | 如果为true,将view的底边缘和parent底边缘对齐 |
android:layout_alignParentEnd | 同上,只是对齐的是parent的尾边缘 |
android:layout_alignParentLeft | 同上,只是对齐的是parent的左边缘 |
android:layout_alignParentRight | 同上,只是对齐的是parent的右边缘 |
android:layout_alignParentStart | 同上,只是对齐的是parent的开始边缘 |
android:layout_alignParentTop | 同上,只是对齐的是parent的顶部边缘 |
android:layout_alignRight | 将view的右边缘与给定id的view 的右边缘对齐 |
android:layout_alignStart | 同上,只是对齐的是开始边缘 |
android:layout_alignTop | 同上,只是对齐的是顶部边缘 |
android:layout_alignWithParentIfMissing | 如果为true,当找不到layout_toLeftOf, layout_toRightOf等属性的锚点时,将会把parent作为锚点 |
android:layout_below | 将view放在给定id的view下方 |
android:layout_centerHorizontal | 如果为true,将位于parent的水平居中位置 |
android:layout_centerInParent | 如果为true,将位于parent的水平、竖直居中位置 |
android:layout_centerVertical | 如果为true,将位于parent的竖直居中位置 |
android:layout_toEndOf | 将view放在给定id的view尾部 |
android:layout_toLeftOf | 将view放在给定id的view左边 |
android:layout_toRightOf | 将view放在给定id的view右边 |
android:layout_toStartOf | 将view放在给定id的view开始位置 |
成员变量
public boolean alignWithParent
如果为true 当锚点view不存在或者处于gone的状态时,将使用parent作为锚点
构造方法
和MarginLayoutParams 相较多了一个可以根据RelativeLayout.LayoutParams 创建布局参数的构造方法
公有方法
void addRule(int verb, int subject)
添加一个规则,必须和兄弟节点相关联,来解释relativelayout布局
int verb 一个布局的动词,官网文档以RelativeLayout.ALIGN_RIGHT为例,点开进去看到还有很多类似的比如ALIGN_TOP等,个人理解是添加了一种规则。
int subject 锚点view的id或者是一个布尔值(表示RelativeLayout.TRUE 来表示true 或者0表示false,当为true时代表启用这个verb,false时不启用这个verb,适用于不需要锚点的verb)
void addRule(int verb)
添加一个规则,必须不能与兄弟节点相关联或者属性值为布尔值,来解释relativelayout布局
String debug(String output)
作用同之前讲过的
int getRule(int verb)
获取规则
int[] getRules()
获取一组规则
void removeRule(int verb)
移除一个规则
void resolveLayoutDirection(int layoutDirection)
作用同之前讲过的
本文地址:https://blog.csdn.net/mrkyee/article/details/107917311
推荐阅读