布局资源定义了UI的Activity或组件的界面架构。
文件位置(FILE LOCATION):
res/layout/filename.xml
文件名被用作资源ID。
被编译资源的数据类型(COMPILED RESOURCE DATATYPE):
资源指向一个View对象或其子类。
资源引用(RESOURCE REFERENCE):
在Java代码中:R.layout.filename
在XML中:@[package:]layout/filename
语法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<ViewGroup xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@[+][package:]id/resource_name"
android:layout_height=["dimension" | "fill_parent" | "wrap_content"]
android:layout_width=["dimension" | "fill_parent" | "wrap_content"]
[ViewGroup-specific attributes] >
<View
android:id="@[+][package:]id/resource_name"
android:layout_height=["dimension" | "fill_parent" | "wrap_content"]
android:layout_width=["dimension" | "fill_parent" | "wrap_content"]
[View-specific attributes] >
<requestFocus/>
</View>
<ViewGroup >
<View />
</ViewGroup>
<include layout="@layout/layout_resource"/>
</ViewGroup>
注意:根元素可以是ViewGroup或View类型的元素,也可以是<merge>元素,但是必须只有一个根元素,并且它必须包含xmlns:android属性,像上面显示的那样来指定XML的命名空间。
元素(ELEMENTS):
<ViewGroup>
它是一个其他View元素的容器。有很多不同类型的ViewGroup对象,并且每个都用不同的方法来指定子元素的布局。不同类型的ViewGroup对象包括:LinearLayout、RelativeLayout、以及FrameLayout。
不能假设ViewGroup会接受任何类型View对象的嵌套。某些ViewGroup类是AdapterView类的实现,这就决定了它们的子元素仅能来自Adapter类型。
属性(ATTRIBUTES):
android:id
定义资源的ID,它唯一标识这个元素,在应用程序中能够使用这个ID来获取ViewGroup元素的引用。
android:layout_height
尺寸值或关键词,必须的,它定义了容器的高度,用尺寸值(或尺寸资源)或关键词(fill_parent或wrap_content)来表示。
android:layout_width
尺寸值或关键词。必须的,它定义了容器的高度,用尺寸值(或尺寸资源)或关键词(fill_parent或wrap_content)来表示。
ViewGroup基类会支持多个属性,并且每个实现ViewGroup的子类都会支持这些属性。对于所有这些可用的属性,请参照相应的ViewGroup类文档。
<View>
它定义一个独立的UI组件,通常叫做“widget”。不同的View对象类型包括:TextView、Button、以及CheckBox等。
属性(ATTRIBUTES):
android:id
定义资源ID,它唯一标识资源,在应用程序中能够使用这个ID获取要引用的View对象。
android:layout_height
尺寸值或关键词,必须的。它定义元素的高度,用尺寸值(或尺寸资源)或关键词(fill_parent或wrap_content)表示。
android:layout_width
尺寸值或关键词,必须的。它定义元素的宽度,用尺寸值(或尺寸资源)或关键词(fill_parent或wrap_content)表示。
View基类支持的很多属性,也会被每个实现的View子类所支持。更多的信息可阅读XML布局(http://developer.android.com/guide/topics/ui/declaring-layout.html)。对于所有的可用的属性,请参照对应的View类。
<requestFocus>
它代表任意View对象元素,包括空元素,能够给屏幕上的父容器赋予初始焦点。在每个文件中只能有一个这样的元素。
<include>
把另一个布局文件包含到本布局中。
属性(ATTRIBUTES):
layout
布局资源,必须的。它指向一个要引用的布局资源。
android:id
资源ID。它会覆盖在被包含布局中赋予根View元素的资源ID。
android:layout_height
尺寸值或关键词。它会覆盖在被包含布局中赋予根View元素的高度。只有android:layout_width属性也被声明了,它才会有效。
android:layout_width
尺寸值或关键词。它会覆盖在被包含布局中赋予根View元素的宽度。只有android:layout_height也声明了,它才会有效。
在<include>中能够包含任何其他的由被包含布局中的根元素所支持的布局属性,并且它们会覆盖那些定义在根元素中的值。
警告:如果要覆盖这些布局尺寸,必须同时覆盖android:layout_height和android:layout_width—-不能只覆盖其中之一,如果只覆盖一个,那么不会有任何效果。(其他的布局属性,如重量等依然会继承原始布局。)
包含布局的另一个方法是使用ViewStub元素。它是一个轻量的View,指导明确的要填充它时才会占用布局空间,它用android:layout属性定义一个要包含的布局文件。
<merge>
一个可替代的没有被放到布局层次树中的根元素。当确定要把这个布局放到一个布局中,这个布局已经包含了与之相适应的,能够包含<merge>元素的子元素的父View对象的时候,使用<merge>作为根元素是有用的。在计划使用<include>元素把一个布局包含到另一个布局中,并且这个布局不需要不同的ViewGroup容器时,这种方法就特别有用。关于合并布局的更多信息,请阅读布局技巧:合并(http://developer.android.com/resources/articles/layout-tricks-merge.html)。
关于android:id的值
关于ID值,通常使用的语法格式是:@+id/name。其中“+”指示这是一个新的资源ID,并且如果这个ID不存在,aapt工具在R.java类中创建一个新的资源整数,例如:
<TextViewandroid:id="@+id/nameTextbox"/>
nameTextbox名字就是这个资源的ID。在Java代码中可以下面这样引用与这个ID关联的TextView对象:
findViewById(R.id.nameTextbox);
但是,如果已经定义一个ID资源(并且它没有被使用),那么通过去掉android:id值中的“+”号,能够把这个ID分配给一个View元素。
关于android:layout_height和android:layout_width的值
高度和宽度值能够使用任意的Android所支持的尺寸单位(px、dp、sp、pt、in、mm)来表示或者使用下列关键字:
值 | 说明 |
match_parent | 设置元素的尺寸要跟它的父元素相匹配。被添加在API级别8中,以便弃用fill_parent关键字 |
fill_parent | 设置元素的尺寸要跟它的父元素相匹配。 |
wrap_content | 设置元素的尺寸与元素内容所要求的尺寸相匹配。 |
定制View元素
你可以创建自己定制的View和ViewGroup元素,并把它们跟标准的布局元素一样应用到布局中。还可以在XML元素中指定它所支持的属性。要学习更多的内容,可参考“定制组件”开发指南。(http://blog.csdn.net/fireofstar/article/details/7420378)
例子(EXAMPLE):
XML文件被保存在res/layout/main_activity.xml中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextViewandroid:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView"/>
<Buttonandroid:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button"/>
</LinearLayout>
应用程序代码会在onCreate()方法中给Activity加载这个布局:
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView.(R.layout.main_activity);
}