五大布局
FrameLayout(帧布局)
private void frameLayout(){
/**
* 默认子元素从左上角开始布局
*
* 子元素可以用layout_gravity限定位置
*
*/
mFrameLayout = new FrameLayout(this);
FrameLayout.LayoutParams flLP = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.WRAP_CONTENT);
mFrameLayout.addView(new TextView(this),flLP);
}
LinearLayout(线性布局)
private void linearLayout(){
mLinearLayout = new LinearLayout(this);
/**
* 默认是HORIZONTAL
* 当HORIZONTAL时,gravity只能对左右布局,子元素layout_gravity左右布局失效
*
* 当VERTICAL时,gravity只能对上下布局,子元素layout_gravity上下布局失效
*/
mLinearLayout.setOrientation(LinearLayout.VERTICAL);
/**
* 一共的权重
*/
mLinearLayout.setWeightSum(1);
/**
* 插入间隔图片
*/
mLinearLayout.setDividerDrawable(this.getResources().getDrawable(R.drawable.shap_line));
mLinearLayout.setDividerPadding(3);
mLinearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_BEGINNING);
LinearLayout.LayoutParams llLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
/**
* 子元素权重
*/
llLP.weight = 1.0f;
mLinearLayout.addView(new TextView(this),llLP);
}
RelativeLayout(相对布局)
private void relativeLayout(){
mRelativeLayout = new RelativeLayout(this);
RelativeLayout.LayoutParams rlLP = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT);
/**********************************************
*根据父容器布局
*/
/**
* 父容器顶部
*/
rlLP.addRule(RelativeLayout.ALIGN_PARENT_TOP,RelativeLayout.TRUE);
/**
* 父容器左边
*/
rlLP.addRule(RelativeLayout.ALIGN_PARENT_LEFT,RelativeLayout.TRUE);
/**
* 父容器右边
*/
rlLP.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,RelativeLayout.TRUE);
/**
* 父容器底部
*/
rlLP.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);
/**
* 父容器水平居中
*/
rlLP.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);
/**
* 父容器垂直居中
*/
rlLP.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);
/**
* 父容器居中
*/
rlLP.addRule(RelativeLayout.CENTER_IN_PARENT,RelativeLayout.TRUE);
/***********************************************
* 根据兄弟布局
*/
/**
* 在某个元素的下面
*/
rlLP.addRule(RelativeLayout.BELOW,R.id.text);
/**
* 在某个元素的上面面
*/
rlLP.addRule(RelativeLayout.ABOVE,R.id.text);
/**
* 在某个元素的左边
*/
rlLP.addRule(RelativeLayout.LEFT_OF,R.id.text);
/**
* 在某个元素的右边
*/
rlLP.addRule(RelativeLayout.RIGHT_OF,R.id.text);
/**
*参考某个元素的下边界
*/
rlLP.addRule(RelativeLayout.ALIGN_BOTTOM,R.id.text);
/**
*参考某个元素的上边界
*/
rlLP.addRule(RelativeLayout.ALIGN_TOP,R.id.text);
/**
*参考某个元素的左边界
*/
rlLP.addRule(RelativeLayout.ALIGN_LEFT,R.id.text);
/**
*参考某个元素的右边界
*/
rlLP.addRule(RelativeLayout.ALIGN_RIGHT,R.id.text);
/**
* 内容的基准线
*/
rlLP.addRule(RelativeLayout.ALIGN_BASELINE,R.id.text);
}
AbsoluteLayout(绝对布局)
被废弃
TableLayout(表格布局)
没怎么用到
< include />标签
使用
<include
android:id="@+id/top"
layout="@layout/view_layout"
android:layout_width="10dp"
android:layout_height="4dp"
android:layout_marginLeft="30dp" />
#注意点
- 设置id
- layout_*属性需要在设置了layout_width和layout_height后才可以使用
更加详细的需要看源码
< merge/>标签
使用
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/ttt"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#0000FF" />
</merge>
注意点
- merge必须放在布局文件的根节点上。
- merge并不是一个ViewGroup,也不是一个View,它相当于声明了一些视图,等待被添加。
- merge标签被添加到A容器下,那么merge下的所有视图将被添加到A容器下。
- 因为merge标签并不是View,所以在通过LayoutInflate.inflate方法渲染的时候, 第二个参数必须指定一个父容器,且第三个参数必须为true,也就是必须为merge下的视图指定一个父亲节点。
- 如果Activity的布局文件根节点是FrameLayout,可以替换为merge标签,这样,执行setContentView之后,会减少一层FrameLayout节点。
- 自定义View如果继承LinearLayout,建议让自定义View的布局文件根节点设置成merge,这样能少一层结点。
- 因为merge不是View,所以对merge标签设置的所有属性都是无效的。
< ViewStub/>标签
特性
- ViewStub是一个继承了View类的视图。
- ViewStub是不可见的,实际上是把宽高都设置为0
- 可以通过布局文件的android:inflatedId或者调用ViewStub的setInflatedId方法为懒加载视图的跟节点设置ID
- ViewStub视图在首次调用setVisibility或者inflate方法之前,一直存在于视图树中
- 只需要调用ViewStub的setVisibility或者inflate方法即可显示懒加载的视图
- 调用setVisibility或者inflate方法之后,懒加载的视图会把ViewStub从父节点中替换掉
- ViewStub的inflate只能被调用一次,第二次调用会抛出异常,setVisibility可以被调用多次,但不建议这么做(后面说原因)
- 为ViewStub赋值的android:layout_属性会替换待加载布局文件的根节点对应的属性
- inflate方法会返回待加载视图的根节点
总结
- ViewStub标签需要必须通过android:layout属性指定待加载的视图资源文件ID,否则会抛异常。
- ViewStub标签的所有android:layout_打头的属性,都会替换待加载视图的跟布局对应属性
- 最好通过ViewStub的inflate方法加载视图,该方法会返回视图根节点。 inflate方法只能调用一次,不建议通过setVisibility加载视图
- 如果需要通过findViewById查找待加载视图中的节点,需要在inflate方法执行之后,否则会找不到