Android应用中的布局资源类型(Layout Resources)

布局资源定义了UI的Activity或组件的界面架构。

文件位置

res/layout/filename.xml
文件名被用作资源ID。

被编译资源的数据类型

资源指向一个View对象或其子类。

资源引用

  • 在Java代码中:
    R.layout.filename
  • 在XML中:
    @[package:]layout/filename

语法

<?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的命名空间。

元素

<ViewGroup>元素

它是一个其他View元素的容器。有很多不同类型的ViewGroup对象,并且每个都用不同的方法来指定子元素的布局。不同类型的ViewGroup对象包括:LinearLayout、RelativeLayout、以及FrameLayout。

不能假设ViewGroup会接受任何类型View对象的嵌套。某些ViewGroup类是AdapterView类的实现,这就决定了它们的子元素仅能来自Adapter类型。

<ViewGroup>元素属性

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等。

<View>元素属性

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>元素

把另一个布局文件包含到本布局中。

<include>元素属性

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元素中指定它所支持的属性。要学习更多的内容,可参考“定制组件”开发指南。

例子

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);
}
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1