2.4.1 Android抽象布局

在布局优化中,Androi的官方提到了这三种布局<include />、<merge />、<ViewStub />

1、布局重用<include /> 该标签能够重用布局文件

1) 签必须使用单独的layout属性:<include layout="@layout/titlebar"/>

    2) 可以使用其他属性。<include />标签若指定了ID属性,而会覆盖layout中的ID

    3) 所有的android:layout_*都是有效的,前提是必须要写layout_width和layout_height两个属性。

    4) 布局中可以包含两个相同的include标签,引用时可以使用如下方法解决(参考):

View bookmarks_container_2  =  findViewById(R.id.bookmarks_favourite);  
bookmarks_container_2.findViewById(R.id.bookmarks_list); 

3、需要时使用<ViewStub />2、减少视图层级<merge />多用于替换FrameLayout

当你需要时才会加载,使用他并不会影响UI初始化时的性能。各种不常用的布局想进度条、显示错误消息等可以使用<ViewStub />标签,以减少内存使用量,加快渲染速度。<ViewStub />是一个不可见的,大小为0的View。<ViewStub />标签使用如下:

<ViewStub 
    android:id="@+id/stub_import" 
    android:inflatedId="@+id/panel_import" 
    android:layout="@layout/progress_overlay" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom" /> 

当你想加载布局时,可以使用下面其中一种方法:
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE); 
// View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate(); 

  当调用inflate()函数的时候,ViewStub被引用的资源替代,并且返回引用的view。 这样程序可以直接得到引用的view而不用再次调用函数findViewById()来查找了。:ViewStub目前还不支持 <merge /> 标签。

2.4.2 Android六大布局

  1. FrameLayout:         层叠布局,在同一位置依次放置View,会盖住原来的东西。
  2. LinearLayout:         线性布局,可分为垂直布局("vertical")和水平布局("horizontal" )。
  3. AbsoluteLayout:      绝对布局,不建议使用。
  4. RelativeLayout:       相对布局,可以理解为某一个元素为参照物,有各种参照属性。
  5. TableLayout:           表格布局,每一个TableLayout里面TableRow,用来具体定义每一个元素。
  6. GridLayout:          网格布局,android4.0以上版本出现的。

GridLayout布局使用虚细线将布局划分为行、列和单元格,也支持一个控件在行、列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,GridLayout的布局策略简单分为以下三个部分:

首先它与LinearLayout布局一样,也分为水平和垂直两种方式,默认是水平布局,一个控件挨着一个控件从左到右依次排列,但是通过指定android:columnCount设置列数的属性后,控件会自动换行进行排列。

另一方面,对于GridLayout布局中的子控件,默认按照wrap_content的方式设置其显示,这只需要在GridLayout布局中显式声明即可。

其次,若要指定某控件显示在固定的行或列,只需设置该子控件的android:layout_row和android:layout_column属性即可,但是需要注意:android:layout_row=”0”表示从第一行开始,android:layout_column=”0”表示从第一列开始。

2.4.3 属性android:layout_weight

  首先声明只有在Linearlayout中,该属性才有效。设置android:layout_width或android:layout_height为"0dp"和match_parent会造成两种截然相反的效果。它的原理是:按比例分配剩余空间

  • 当android:layout_width="0dp"时,在分配剩余空间阶段,比例按照layout_weight,也就是越大分得越大。
  • 当android:layout_width="fill_parent"时,分配宽度能把所有空间分满,剩余的空间是负数,所以分配的越大,最终空间越小。