五大布局

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方法执行之后,否则会找不到

http://blog.csdn.net/a740169405/article/details/50351013

results matching ""

    No results matching ""