Android布局

161 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

布局

布局定义了应用中的界面结构(例如 Activity 的界面结构)。布局中的所有元素均使用 ViewViewGroup 对象的层次结构进行构建。View 通常用于绘制用户可看到并与之交互的内容。ViewGroup 则是不可见的容器,用于定义 View 和其他 ViewGroup 对象的布局结构,如图 1 所示。

image.png View 对象通常称为“微件”,可以是多个子类之一,例如 ButtonTextViewViewGroup 对象通常称为“布局”,可以是提供不同布局结构的众多类型之一,例如 LinearLayoutConstraintLayout

您可通过两种方式声明布局:

  • 在 XML 中声明界面元素。Android 提供对应 View 类及其子类的简明 XML 词汇,如用于微件和布局的词汇。

您也可使用 Android Studio 的 Layout Editor,并采用拖放界面来构建 XML 布局。

  • 在运行时实例化布局元素。您的应用能以程序化方式创建 View 对象和 ViewGroup 对象(并操纵其属性)。

每个布局文件都必须只包含一个根元素,并且该元素必须是视图对象或 ViewGroup 对象。定义根元素后,您可以子元素的形式添加其他布局对象或微件,从而逐步构建定义布局的视图层次结构。例如,以下 XML 布局使用垂直 LinearLayout来储存 TextViewButton

在 XML 中声明布局后,请以 .xml 扩展名将文件保存在您 Android 项目的 res/layout/ 目录中,以便该文件能正确编译。

加载XML资源

在编译应用的时候,系统会将每个XML布局文件编译成View资源,应在Activity,onCreate()回调实现内加载应用代码中的布局资源。通过调用setContenView(),并以R.layout.layout_file_name形式向应用代码传递对布局资源的引用,您可执行此操作。例如,如果你的xml布局保存为main_layout.xml。您应通过如下方式为Activity加载布局资源:

public void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); 
setContenView(R.layout.main_layout); }

启动Activity时,Android框架会调用Activity中的onCreate()回调方法

属性

每个 View 对象和 ViewGroup 对象均支持自己的各种 XML 属性。某些属性是 View 对象的特有属性(例如,TextView 支持 textSize 属性),但可扩展此类的任一 View 对象也会继承这些属性。某些属性是所有 View 对象的共有属性,因为它们继承自 View 根类(例如 id 属性)。此外,其他属性被视为“布局参数”,即描述 View 对象特定布局方向的属性,如该对象的父 ViewGroup 对象所定义的属性。

ID

任何 View 对象均可拥有与之关联的整型 ID,用于在结构树中对 View 对象进行唯一标识。编译应用后,系统会以整型形式引用此 ID,但在布局 XML 文件中,系统通常会以字符串的形式在 id 属性中指定该 ID。这是所有 View 对象共有的 XML 属性(由 View 类定义),并且您会经常使用该属性。XML 标记内部的 ID 语法是:

android:id="@+id/my_button"

字符串开头处的 @ 符号指示 XML 解析器应解析并展开 ID 字符串的其余部分,并将其标识为 ID 资源。加号 (+) 表示这是一个新的资源名称,必须创建该名称并将其添加到我们的资源(在 R.java 文件中)内。Android 框架还提供许多其他 ID 资源。引用 Android 资源 ID 时,不需要加号,但必须添加 android 软件包命名空间,如下所示:

android:id="@android:id/empty"

添加 android 软件包命名空间后,我们现在将从 android.R 资源类而非本地资源类引用 ID。

为了创建视图并从应用中引用它们,常见的模式是:

1.在布局文件中定义视图/微件,并为其分配唯一 ID:


<Button android:id="@+id/my_button" android:layout_width="wrap_content" 
android:layout_height="wrap_content" android:text="@string/my_button_text"/>

然后创建视图对象的实例,并从布局中捕获它(通常使用 onCreate() 方法):


Button myButton = (Button) findViewById(R.id.my_button);