Android 用户界面---共同的布局对象(Common Layout Objects)

长平狐 发布于 2012/10/16 10:22
阅读 620
收藏 0

本节介绍一些应用程序中使用的共同的布局类型。所有的布局对象,它们是ViewGroup类的子类。

FrameLayout

FrameLayout是最简单的布局对象类型。它基本上是屏幕上的一块空白区域,你能够在这块区域中填充一个单一的对象---如切换图片。FrameLayout的所有的子元素都是从屏幕的左上角开始定位的,不能给子View指定不同的位置,后续的子View会描画在前一个子View的上面,并部分或全部的遮挡住前一个View(除非新的对象是透明的)。

LinearLayout

LinearLayout会让其中的所有子对象按照一个方向对齐---垂直或水平,这依赖与orientation属性的定义。所有的子元素都是一次堆放的,因此垂直的列表,每行只有子对象,而不管它们有多宽,并且垂直的列表只有一行(它的高度是最高的那个子视图,加上上下边距)。LinearLayout会关注子View之间的边距和每个子View的重心(右对齐、中心对齐或左对齐)。

 LinearLayout还支持给单独的子View分配权重。这个属性给View对象分配一个重要性的值,允许它在其父View中的剩余空间中展开和填充。子View能够被指定一个整数的权重值,然后ViewGroup中剩余空间会按照它们声明的比例分配给每个子View。默认权重值是0。例如,如果有三个文本框,其中的两个声明的权重值是1,而另一个没有声明权重值(默认是0),那么第三个没有权重的文本框只会占据它的内容所需要的区域,尺寸并不会变大。而另外的两个文本框则在三个文本框被测量后,平分剩余的空间。如果第三个文本框的权重是2(而不是0),那么这就声明了它比其他的两个更重要,因此它会获得总的剩余空间的一半,而另外两个则会平分剩余的空间。

下图1的两个表单使用了LinearLayout布局,它们包含一组相同的子元素:一个按钮、几个标签和文本框。其中文本框的宽度都被设置为fill_parent,其他元素被设置为wrap_content。默认的对齐方式:居左。这两个表单的差异是,左边的表单没有设置权重值(都是0),而右边表单的Comments文本框被设置为1。如果Name文本框也被设置为1,那么NameComments文本框的高度会相同。

1.

在水平的LinearLayout内,项目按照文本的基线的位置来对齐(第一个列表元素的第一行的最上边或最左边被认为是参考线)。这样就便于人们扫视表单中的元素,而不必跳跃着阅读邻近元素中的文本。这种对齐方式能够通过设置布局XML中的android:baselineAligned=”false”属性来关闭。

TableLayout

TableLayout把它的子View定位到行和列中。TableLayout容器不显示行、列或单元格的边框线。表的每行会有多个带有单元格的列。单元格可以为空,但是不能像HTML那样跨列。

TableRow对象是TableLayout的子View(每个TableRow定义了表中的一行)。每行有0或多个单元格,每个单元格都可以定义为不同类型的View。因此一行的单元格可以由不同类型的View对象组成,如ImageViewTextView对象。一个单元格还可以是一个ViewGroup对象(如,可以在一个单元格中嵌入另一个TableLayout对象)。

例如,下面的布局有两行,并且每行有两个单元格。如图2.所示的结果,单元格的边框线用点线显示(添加了显示效果)。

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
   
android:layout_width="fill_parent"
   
android:layout_height="fill_parent"
   
android:stretchColumns="1">
   
<TableRow>
       
<TextView
           
android:text="@string/table_layout_4_open"
           
android:padding="3dip" />
       
<TextView
           
android:text="@string/table_layout_4_open_shortcut"
           
android:gravity="right"
           
android:padding="3dip" />
   
</TableRow>

   
<TableRow>
       
<TextView
           
android:text="@string/table_layout_4_save"
           
android:padding="3dip" />
       
<TextView
           
android:text="@string/table_layout_4_save_shortcut"
           
android:gravity="right"
           
android:padding="3dip" />
   
</TableRow>
</TableLayout>

2.

列能够被隐藏,能够被标记为按照可利用的屏幕空间拉伸和填充,或者被标记为可缩放来强制列缩小,直到表适应屏幕的大小。详细请参考TableLayout类文档。

RelativeLayout

RelativeLayout让子View相对于其父View或其他子View(通过ID指定)来指定自己的位置。因此可以通过有边框让两个元素对齐,或者让一个在另一个的下面,或者居于屏幕的中心等等。元素按照给定的顺序呈现,因此,如果第一个元素在屏幕中是居中的,那么其他的元素也会调整自己,让它们跟第一个元素一样,相对于屏幕中心对齐。还有,因为这种排序的原因,如果使用XML来指定这种布局,要引用的元素在其他View通过引用ID引用它之前,必须在XML文件中被列出。

下面的例子显示如3所示的结果。注意,指定相对元素的属性(如,layout_toLeft),使用相对资源的语法(@id/id)来指定相对的元素。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
               
android:layout_width="fill_parent"
               
android:layout_height="wrap_content"

               
android:background="@drawable/blue"
               
android:padding="10px">

   
<TextViewandroid:id="@+id/label"
             
android:layout_width="fill_parent"

             
android:layout_height="wrap_content"

             
android:text="Type here:"/>


   
<EditTextandroid:id="@+id/entry"
             
android:layout_width="fill_parent"

             
android:layout_height="wrap_content"

             
android:background="@android:drawable/editbox_background"

             
android:layout_below="@id/label"/>
 
   
<Buttonandroid:id="@+id/ok"
           
android:layout_width="wrap_content"

           
android:layout_height="wrap_content"

           
android:layout_below="@id/entry"

           
android:layout_alignParentRight="true"
           
android:layout_marginLeft="10px"
           
android:text="OK"/>

   
<Buttonandroid:layout_width="wrap_content"
           
android:layout_height="wrap_content"

           
android:layout_toLeftOf="@id/ok"
           
android:layout_alignTop="@id/ok"
           
android:text="Cancel"/>
</RelativeLayout>

3.

上例中,其中有些属性是元素所直接支持的,而有些属性则是由它们的LayoutParams成员支持的(在这个界面中,所有的元素都是RelativeLayout容器对象的子对象)。被定义的RelativeLayout参数是:widthheightbelowalignToptoLeftpadding[Bottom|Left|Right|Top]margin[Bottom|Left|Right|Top]。注意,其中有些参数是相对布局位置所专有的---它们必须是指向相对元素的ID。如,一个分配了toLeft=”my_button”参数的TextView将会被放在IDmy_buttonView对象的左边(在XML中,IDmy_buttonView元素必须在引用它的元素之前被编写)。

重要的ViewGroup对象的介绍

下表中的这些对象都能够持有子UI元素。其中一些有自己的可见的UI样式,而另一些仅提供了管理子View布局的不可见结构。

说明

FrameLayout

显示单一对象的View框的布局

Gallery

跟一个图片列表绑定,水平滚动显示图片

GridView

显示一个由m列和n行组成的滚动网格

LinearLayout

把子对象组织到一个单行(水平方向)或单列(垂直方向)的中的布局,如果窗口超出了屏幕的长度或高度,它会创建一个滚动条。

ListView

显示一个滚动的单列列表。

RelativeLayout

能够给一个子对象指定相对于其他子对象(子对象A在子对象B的左边)或父对象的位置。

ScrollView

一个垂直滚动的元素列

Spinner

每次显示绑定数据列表中的一项,内部是一个单行文本框,而不是一个可以水平或垂直滚动的单行列表框。

SurfaceView

提供对专用描画界面的直接访问。它能够在界面上分层持有子View,但是这只适用于需要描画像素的应用程序,而不是Widget组件。

TabHost

提供一个监视点击事件的选择标签的列表,并且在一个标签被点击时,能够让应用程序改变屏幕的显示。

TableLayout

一个带有任意数量行和列的表格布局,每个单元格可持有你选择的Widget。行会调整尺寸来适应最大的列。单元格的边框不可见。

ViewFlipper

每次显示一项的列表,内部是一个单行文本框,它能够被设置成像幻灯片一样,每隔一段时间切换一项。

ViewSwitcher

ViewFlipper一样

 


原文链接: http://blog.csdn.net/fireofstar/article/details/7432806
加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部