布局

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

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

加载 XML 资源

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

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}

启动 Activity 时,Android 框架会调用 Activity 中的 onCreate() 回调方法(请参阅 Activity文档中有关生命周期的阐述)。

  • 属性

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

任何 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。

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

在布局文件中定义视图/微件,并为其分配唯一 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);

名为 layout_*something* 的 XML 布局属性可以为视图定义适合其所在 ViewGroup 的布局参数。

每个 ViewGroup 类都会实现一个扩展 ViewGroup.LayoutParams 的嵌套类。此子类包含的属性类型会根据需要为视图组的每个子视图定义尺寸和位置。如图 2 所示,父视图组会为每个子视图(包括子视图组)定义布局参数。

每个 ViewGroup 类都会实现一个扩展 ViewGroup.LayoutParams`的嵌套类。此子类包含的属性类型会根据需要为视图组的每个子视图定义尺寸和位置。如图 2 所示,父视图组会为每个子视图(包括子视图组)定义布局参数。

请注意,每个 LayoutParams 子类都有自己的值设置语法。每个子元素都必须定义适合其父元素的 LayoutParams,但父元素也可为其子元素定义不同的 LayoutParams。

所有视图组均包含宽度和高度(layout_widthlayout_height),并且每个视图都必须定义它们。许多 LayoutParams 还包括可选的外边距和边框。

您可以指定具有确切尺寸的宽度和高度,但您多半不想经常这样做。更常见的情况是,您会使用以下某种常量来设置宽度或高度:

  • 指示您的视图将其大小调整为内容所需的尺寸。
  • 指示您的视图尽可能采用其父视图组所允许的最大尺寸。

一般而言,建议不要使用绝对单位(如像素)来指定布局宽度和高度。更好的方法是使用相对测量单位(如与密度无关的像素单位 dp),因为其有助于确保您的应用在各类尺寸的设备屏幕上正确显示。可用资源文档中定义了可接受的测量单位类型。

布局位置

视图的几何形状就是矩形的几何形状。视图拥有一个位置(以一对水平向左垂直向上的坐标表示)和两个尺寸(以宽度和高度表示)。位置和尺寸的单位是像素。

您可以通过调用 getLeft() 方法和 getTop()方法来检索视图的位置。前者会返回表示视图的矩形的水平向左(或称 X 轴)坐标。后者会返回表示视图的矩形的垂直向上(或称 Y 轴)坐标。这些方法都会返回视图相对于其父项的位置。例如,如果 getLeft() 返回 20,则表示视图位于其直接父项左边缘向右 20 个像素处。

此外,系统还提供了几种便捷方法来避免不必要的计算,即 getRight()getBottom()。这些方法会返回表示视图的矩形的右边缘和下边缘的坐标。例如,调用 getRight()类似于进行以下计算:getLeft() + getWidth()

尺寸、内边距和外边距

视图尺寸通过宽度和高度表示。实际上,视图拥有两对宽度和高度值。

第一对称为测量宽度测量高度。这些尺寸定义视图希望在其父项内具有的大小。您可通过调用 getMeasuredWidth()getMeasuredHeight() 来获得这些测量尺寸。

第二对简称为宽度高度,有时称为绘制宽度绘制高度。这些尺寸定义绘制时和布局后,视图在屏幕上的实际尺寸。这些值可以(但不必)与测量宽度和测量高度不同。您可通过调用 getWidth()getHeight() 来获得宽度和高度。

如要测量尺寸,视图需将其内边距考虑在内。内边距以视图左侧、顶部、右侧和底部各部分的像素数表示。内边距可用于以特定数量的像素弥补视图内容。例如,若左侧内边距为 2,则会将视图内容从左边缘向右推 2 个像素。您可以使用 [setPadding(int, int, int, int)]方法设置内边距,并通过调用 getPaddingLeft()getPaddingTop()getPaddingRight()getPaddingBottom()查询内边距。

尽管视图可以定义内边距,但其并不提供对外边距的任何支持。不过,视图组可以提供此类支持。如需了解更多信息,请参阅 ViewGroupViewGroup.MarginLayoutParams

文件位置:
res/values/filename.xml
文件名可以任意设置。 元素的 name 将用作资源 ID。
资源引用:
在 Java 中:R.bool.bool_name
在 XML 中:@[package:]bool/bool_name
语法:

元素:

必需。该元素必须是根节点。
没有属性。

布尔值:true 或 false。
属性:

name
字符串。Bool 值的名称。该名称将用作资源 ID。
示例:
保存在 res/values-small/bools.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="screen_small">true</bool>
        <bool name="adjust_view_bounds">true</bool>
    </resources>
    

以下应用代码会检索布尔值:

颜色

在 XML 中定义的颜色值。颜色使用 RGB 值和 alpha 通道指定。您可以在接受十六进制颜色值的任何地方使用颜色资源。当 XML 中需要可绘制资源时,您也可以使用颜色资源(例如,android:drawable="@color/green")。

该值始终以井号 (#) 字符开头,后跟以下某种格式的“透明度、红、绿、蓝”(Alpha-Red-Green-Blue) 信息:

#RGB
#ARGB
#RRGGBB
#AARRGGBB

文件位置:
res/values/colors.xml
该文件名可以任意设置。 元素的 name 将用作资源 ID。
资源引用:
在 Java 中:R.color.color_name
在 XML 中:@[package:]color/color_name
语法:

元素:

必需。该元素必须是根节点。
没有属性。

以十六进制表示的颜色,如上所述。
属性:

name
字符串。颜色的名称。该名称将用作资源 ID。
示例:
保存在 res/values/colors.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
       <color name="opaque_red">#f00</color>
       <color name="translucent_red">#80ff0000</color>
    </resources>
    

尺寸

在 XML 中定义的尺寸值。尺寸由数字后跟度量单位来指定。例如:10px、2in、5sp。Android 支持以下度量单位:

dp
密度无关像素 - 基于屏幕物理密度的抽象单位。这些单位相对于 160 dpi(每英寸点数)屏幕确立,在该屏幕上 1dp 大致等于 1px。在更高密度的屏幕上运行时,用于绘制 1dp 的像素数量会根据屏幕 dpi 按照适当的系数增加。同样,在更低密度的屏幕上,用于绘制 1dp 的像素数量会相应减少。dp 对像素的比率会随着屏幕密度的变化而变化,但不一定成正比。要使布局中的视图尺寸根据不同的屏幕密度正确调整大小,一种简单的解决办法就是使用 dp 单位(而不是 px 单位)。换句话说,它可在不同设备上提供一致的界面元素大小。
sp
缩放无关像素 - 这和 dp 单位类似,但它也会根据用户的字体大小偏好设置进行缩放。建议您在指定字体大小时使用此单位,以便字体大小会根据屏幕密度和用户偏好设置进行调整。
pt
点 - 1/72 英寸,基于屏幕的物理尺寸,假设屏幕密度为 72dpi。
px
像素 - 对应于屏幕上的实际像素数。建议不要使用这种度量单位,因为不同设备的实际呈现效果可能不同;每台设备的每英寸像素数可能不同,屏幕上的总像素数也可能有差异。
mm
毫米 - 基于屏幕的物理尺寸。
in
英寸 - 基于屏幕的物理尺寸。

文件位置:
res/values/filename.xml
该文件名可以任意设置。 元素的 name 将用作资源 ID。
资源引用:
在 Java 中:R.dimen.dimension_name
在 XML 中:@[package:]dimen/dimension_name
语法:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <dimen name="textview_height">25dp</dimen>
        <dimen name="textview_width">150dp</dimen>
        <dimen name="ball_radius">30dp</dimen>
        <dimen name="font_size">16sp</dimen>
    </resources>
    

ID

在 XML 中定义的唯一资源 ID。Android 开发者工具可使用您在 <item> 元素中提供的名称,在您项目的 R.java 类中创建唯一的整数,供您用作应用资源(例如,界面布局中的 View)的标识符,或创建唯一的整数,供您在应用代码中使用(例如,作为对话框的 ID 或结果代码)。

文件位置:
res/values/filename.xml
该文件名可以任意设置。
资源引用:
在 Java 中:R.id.name
在 XML 中:@[package:]id/name
语法:

元素:

必需。该元素必须是根节点。
没有属性。

定义唯一 ID。不设置值,只有属性。
属性:

type
必须为“id”。
name
字符串。ID 的唯一名称。
示例:
保存在 res/values/ids.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item type="id" name="button_ok" />
        <item type="id" name="dialog_exit" />
    </resources>
    

然后,以下布局代码段会将“button_ok”ID 应用到按钮微件:

    <Button android:id="@id/button_ok"
        style="@style/button_style" />
    

请注意,android:id 值不会在 ID 引用中包含加号,因为此 ID 已存在,如上面的 ids.xml 示例中所定义。(如果使用加号以 android:id="@+id/name" 格式指定 XML 资源的 ID,则表示“name”ID 不存在,应该创建它。)

再比如,以下代码段使用“dialog_exit”ID 作为对话框的唯一标识符:

整数

在 XML 中定义的整数。

文件位置:
res/values/filename.xml
该文件名可以任意设置。 元素的 name 将用作资源 ID。
资源引用:
在 Java 中:R.integer.integer_name
在 XML 中:@[package:]integer/integer_name
语法:

元素:

必需。该元素必须是根节点。
没有属性。

一个整数。
属性:

name
字符串。该整数的名称。该名称将用作资源 ID。
示例:
保存在 res/values/integers.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <integer name="max_speed">75</integer>
        <integer name="min_speed">5</integer>
    </resources>

以下应用代码会检索整数:

整数数组

在 XML 中定义的整数数组。

文件位置:
res/values/filename.xml
该文件名可以任意设置。 元素的 name 将用作资源 ID。
编译后的资源数据类型:
指向整数数组的资源指针。
资源引用:
在 Java 中:R.array.integer_array_name
在 XML 中:@[package:]array.integer_array_name
语法:

元素:

必需。该元素必须是根节点。
没有属性。

定义一个整数数组。包含一个或多个 子元素。
属性:

android:name
字符串。数组的名称。此名称将用作引用数组的资源 ID。

一个整数。该值可以是对另一个整数资源的引用。必须是 元素的子元素。
没有属性。
示例:
保存在 res/values/integers.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <integer-array name="bits">
            <item>4</item>
            <item>8</item>
            <item>16</item>
            <item>32</item>
        </integer-array>
    </resources>

以下应用代码会检索整数数组:

类型化数组

在 XML 中定义的 TypedArray。您可以使用这种资源创建其他资源(例如可绘制对象)的数组。请注意,此类数组不要求所含的资源具有相同的类型,因此您可以创建混合资源类型的数组,但必须知道数组中有哪些数据类型及其位置,以便可以使用 TypedArrayget...() 方法正确获取每一项数据。

文件位置:元素的name` 将用作资源 ID。

编译后的资源数据类型:指向 TypedArray 的资源指针。

资源引用:在 Java 中:R.array.array_name [图片上传中...(Screen Shot 2020-09-04 at 8.44.09 AM.png-c28c98-1599180263117-0)]
在 XML 中:@[package:]array.array_name

语法:

元素:

必需。该元素必须是根节点。
没有属性。

定义一个数组。包含一个或多个 子元素。
属性:

android:name
字符串。数组的名称。此名称将用作引用数组的资源 ID。

通用资源。该值可以是对资源或简单数据类型的引用。必须是 元素的子元素。
没有属性。
示例:
保存在 res/values/arrays.xml 的 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <array name="icons">
            <item>@drawable/home</item>
            <item>@drawable/settings</item>
            <item>@drawable/logout</item>
        </array>
        <array name="colors">
            <item>#FFFF0000</item>
            <item>#FF00FF00</item>
            <item>#FF0000FF</item>
        </array>
    </resources>
    

以下应用代码会检索每个数组,然后获取每个数组中的第一个条目:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值