Xamarin.Android 应用程序基础知识

2025年3月17日 | 阅读13分钟

在这里,我们将解释开发人员在开发 Android 应用程序时需要注意的一些任务或概念。

可访问性

在这里,我们将讨论如何使用 Android 辅助功能 API 来构建应用程序。

UI 元素

Android 提供了一个 **ContentDescription** 属性,屏幕阅读 API 使用该属性来描述控件辅助功能的目的。

内容的描述在 AXML 布局文件中。

AXML 布局

在 XML 布局中,我们使用 **android:contentDescription** 属性

TextView 提示

对于数据输入,**EditText** 和 **TextView** 控件使用 Hint 属性来提供预期输入的描述。当输入文本时,文本本身将被“读取”而不是提示。

AXML 布局

XML 布局文件使用 android:hint 属性

LabelFor 将输入字段与标签链接起来

要将标签与数据输入控件关联,我们使用 labelFor 属性。

AXML 布局

在 XML 布局中,我们使用 android:labelFor 属性来引用另一个控件的标识符

辅助功能公告

当启用辅助功能时,我们可以在任何视图控件上使用 AnnounceForAccessibility 方法,以向用户传达事件或状态变化。AnnounceForAccessibility 并非所有操作都必需,因为内置旁白提供了足够的反馈。我们可以在额外信息对用户有帮助的情况下使用 AnnounceForAccessibility。

下面的代码显示了一个调用 AnnounceForAccessibility 的简单示例

更改焦点设置

导航取决于控件的焦点以及用户对操作可用性的理解。Android 提供了一个 Focusable 属性,可以专门标记控件在导航期间能够接收焦点。

AXML 布局

在布局 XML 文件中,设置 Android:focusable 属性

我们可以通过 nextFocusDown、nextFocusLeft、nextFocusUp 属性来控制控件的焦点顺序,这些属性在 XAML 布局中设置。我们使用这些属性来确保用户可以轻松地在屏幕上的控件之间导航。

Android 资源

在这里,我们将展示 Xamarin 中 Android 资源的概念。

一个 Android 应用程序只是源代码。许多文件可以构成应用程序,例如视频、图像、字体和音频文件。非源代码文件被称为资源,在构建过程中进行编译,并打包成 APK 以分发和安装到设备中。

Xamarin.Android Application Fundamentals

资源为 Android 应用程序提供了不同的优势

  • **代码分离:**资源将源代码与图像、字符串、菜单、动画、颜色等分离。资源还有助于本地化。
  • **针对多个设备:**资源支持不同的设备,而无需更改代码。
  • **编译时检查:**在应用程序中,资源是静态的并编译到应用程序中。在编译时,这允许验证资源。那时,很容易捕获和纠正错误。在运行时,更难发现错误,并且纠正错误的成本很高。

当启动一个新的 Xamarin.Android 项目时,会创建一个专门的 Resources 目录,以及一些子目录。

Xamarin.Android Application Fundamentals

此屏幕截图显示应用程序资源根据其类型组织到子目录中。**Drawable** 目录包含图像;视图位于 **layout** 子目录中,等等。

这里有两种在 Xamarin.Android 应用程序中访问 **Resources** 的方式:在代码中以编程方式访问,以及在 XML 中使用 XML 语法声明式地访问。

这些资源被称为**默认资源**,并被所有设备使用,除非找到更具体的匹配项。每种资源类型都可以有备用资源,Android 可以使用这些资源来针对特定工具。

**例如,**提供的资源旨在针对用户的语言环境和屏幕尺寸。如果设备从纵向旋转 90 度到横向,那么在所有情况下,Android 都会为应用程序加载资源,而无需任何额外的编码工作。

在包含其他资源的目录的末尾,通过添加一个短字符串来指定,该字符串称为限定符。

**例如,** **resources/drawable-de** 将指定设置为德语语言环境的设备的图像,而 **resources/drawable-fr** 将保存设置为法语区域的设备的图像。提供其他资源的示例可以在下图看到,其中相同的应用程序正在运行,并更改了设备的语言环境。

Xamarin.Android Application Fundamentals

在这里,我们将讨论一些与资源相关的更多基本术语。这些是

Android 资源基础

几乎所有 Android 应用程序都有一些资源。应用程序通常以 XML 文件的形式拥有用户界面布局。当我们第一次创建 Xamarin.Android 应用程序时,Xamarin.Android 项目模板会设置默认资源。

Xamarin.Android Application Fundamentals

如屏幕截图所示,这里有五个文件在资源文件夹中创建了默认资源。

  • **Icon.png -** 这是应用程序的默认图标。
  • **Main.axml -** Main.axml 是应用程序的默认用户界面布局文件。Android 使用 .xml 文件扩展名,而 Xamarin.Android 使用 .axml 文件扩展名。
  • **Strings.xml -** 字符串表有助于应用程序本地化。
  • **AboutResources.txt -** 此文件对应用程序不是必需的,可以安全删除。它只提供了资源文件夹的概述以及其中包含的文件。
  • **Resource.designer. Cs -** 此文件由 Xamarin.Android 自动生成和维护,其中包含分配给每个资源的唯一 ID。Resource.designer. Cs 与 R.java 文件非常相似且相同。Xamarin 自动创建它。Android 工具会不时重新生成它。

创建和访问资源

创建资源就像将文件添加到资源目录一样简单。当 Strings.xml 添加到文件时,Xamarin.Android 工具会自动将 Build Action 设置为 AndroidResources。

Xamarin.Android Application Fundamentals

这使得 Xamarin.Android 工具能够正确编译并将资源嵌入到 APK 文件中。如果由于任何原因,**Build Action** 未设置为 **Android Resources**,那么数据将被排除在 APK 之外。在加载或访问时,**Resources** 会导致运行时错误,并且应用程序会崩溃。

Android 资源项只支持小写文件名,而 **Xamarin**。**Android** 同时支持大写和小写。图像名称的约定是使用小写字母和下划线作为分隔符,例如 **my_image_name.png**。如果使用连字符或空格作为分隔符,则无法处理 **Resources** 的名称。

以编程方式引用资源

为了以编程方式访问所有资源文件,会为数据分配一个唯一的 ResourceID。资源 ID 是在名为 Resources 的特定类中定义的整数,该类位于文件 **Resource.Designer.CS** 中。

代码看起来像这样

每个 ResourceID 都存在于嵌套类中,该嵌套类对应于资源的类型。

当 icon.png 文件添加到项目时,**Xamarin.Android** 更新了 Resource 类并创建了一个名为 Drawable 的嵌套类,其中包含常量名称 icon。Drawable 允许在代码中将文件 **icon.png** 引用为 **Resource.Drawable.Icon**。

Resource 类不应手动编辑;**Xamarin** 将覆盖 **Android** 中的所有更改。

当我们以编程方式引用资源时,它们可以通过 **Resource 类层次结构**访问。这里我们使用以下语法

**包名:**提供了所需资源的包,该资源在另一个包中使用。

**资源类型:**这是资源类中嵌套资源的类型。

**资源名称:**这是资源的文件名(不带文件类型扩展名)或 XML 元素中资源的 **Android:name** 属性的值。

**例如,**布局文件 **main.axml** 的内容是

在此示例中,我们使用了 ImageView,它需要一个可绘制资源名称 flag。ImageView 有一个 src 属性,设置为 @drawable/flag。当活动启动时,Android 将在目录 **Resource/Drawable** 中查找文件 **flag.png**(文件扩展名可以是另一种图像格式,如 **flag.jpg**),并加载文件并将其显示在 ImageView 中。当此应用程序运行时,它看起来像下图所示

Xamarin.Android Application Fundamentals

默认资源

默认资源是不针对任何特定设备的项。如果找不到特定资源,则它是 Android 操作系统​​的默认选择。默认资源是最常见的资源。它们根据资源的类型排列在 **Resource** 目录的子目录中。

Xamarin.Android Application Fundamentals

从上图中可以看出,它显示了可绘制资源、布局和值(包含简单值的 XML 文件)的默认值。

资源类型列表如下:

  • **Drawable:**Drawable 资源是图形的通用概念。Drawable 资源可以编译到应用程序中,并通过 API 调用访问或被其他 XML 资源引用。Drawable 图像的示例有:位图文件(.png、.gif、.jpg)、特殊的、可调整大小的位图(称为九宫格)、XML 中定义的通用形状等。
  • **Layout:**在布局中,XML 文件描述用户界面布局,例如活动或列表中的一行。
  • **Animator:**XML 文件描述了 API 11 (Android 3.0) 中引入的动画属性,并提供了对象的动画属性。属性动画是描述任何对象动画的更灵活、更强大的方式。
  • **anim:**XML 文件描述补间动画。补间动画是视图对象内容上的一系列动画指令,例如图像旋转和文本大小增长。补间动画仅限于视图对象。
  • **color:**XML 文件描述颜色列表。为了理解颜色列表,我们考虑一个 UI 小部件,例如 Button。颜色可能具有不同的状态,例如按下或禁用,并且 Button 可能会随着状态的每次变化而改变颜色。列表显示在状态列表中。
  • **menu:**XML 文件描述应用程序的菜单,例如**选项菜单、上下文菜单和子菜单**。菜单的示例有弹出菜单、标准控制菜单。
  • **raw:**以原始二进制形式保存的任意文件。这些文件以二进制格式编译到 **Android 应用程序**中。
  • **Values:**包含简单值的 XML 文件。在 XML 文件值中,目录不定义单个资源,而是可以标识多个资源。例如,一个 XML 文件包含一个字符串值列表,另一个 XML 文件可能包含颜色值。
  • **xml:**XML 文件的功能类似于 .Net 配置文件。这些是可在应用程序运行时读取的任意 XML 文件。

备用资源

备用资源是针对特定设备的资源。备用资源也定义为运行时配置,例如当前语言、屏幕尺寸和像素密度。如果 Android 可以找到与特定设备或配置匹配的资源,而不是默认资源,在这种情况下,我们将使用备用资源。如果 Android 没有找到任何其他与当前配置匹配的资源,那么我们将加载默认资源。备用资源子目录的名称是 **Resource-type-qualifier**。

限定符是标识特定设备配置的名称。一个名称可以包含多个限定符;每个限定符都用破折号分隔。

Xamarin.Android Application Fundamentals

从上面的截图可以看出,它包含了各种配置的其他资源,如语言环境、屏幕尺寸、屏幕密度和方向。

在将 **限定符** 添加到 **资源** 时,适用以下规则:

  1. 可以有多个限定符,它们之间用破折号分隔。
  2. 限定符只能指定一次。
  3. 限定符在表中显示时必须按顺序排列。

限定符列表如下:

  • **MCC 和 MNC:**MCC 的完整形式是**移动国家代码**,MNC 是**移动网络代码**。SIM 卡将提供 MCC,网络设备将提供 MNC。可以使用移动国家代码来定位语言环境,推荐的方法是使用语言限定符。例如:定位德国资源;限定符将是 mcc262。在美国,针对 T-mobile 的资源,可用的限定符是 **mcc310-mnc206**。
  • **Language:**两位 ISO 639-1 语言代码,后跟两位 ISO-3166-alpha-2 区域代码。如果同时存在这两个限定符,则它们用 -r 分隔。例如,要定位法语语言环境,则使用限定符 fr。要定位加拿大法语区域,则使用 fr-rCA。
  • **Smallest Width:**要执行应用程序,我们必须指定屏幕的最小宽度。API 级别 13 或更高版本可用 (Android 3.2)。
    **例如,**限定符 sw320 dp 用于定位高度和宽度至少为 320 dp 的设备。
  • **屏幕纵横比 -** 屏幕纵横比基于纵横比,而不是屏幕方向。大屏幕更全面。我已在 API 级别 4 (Android 1.6) 中添加。可能的值是 long。
  • **屏幕方向 -** 这包括纵向或横向屏幕方向。屏幕方向可以在应用程序的生命周期中更改。可能的值是 port 和 land。
  • **底座模式 -** 汽车中的设备是底座还是桌面底座。底座模式在 API 级别 8 (Android 2.2.x) 中添加。底座模式中可能的值是 car 和 desk。
  • **夜间模式 -** 应用程序是白天运行还是夜间运行。夜间模式可能会在应用程序的生命周期中更改,旨在允许开发人员在夜间使用较暗版本的界面,并在 API 级别 8 (Android 2.2.x) 中添加。夜间模式中可能的值是 **night** 和 **not night**。
  • **屏幕像素密度 (dpi) -** 屏幕像素密度显示物理屏幕上给定区域中的像素数。通常表示为每英寸点数 (dpi)。可能的值是:
    • ldpi - 低密度屏幕。
    • mdpi - 中密度屏幕
    • hdpi - 高密度屏幕
    • xhdpi - 超高密度显示器
    • nodpi - 未缩放的资源
    • tvdpi - 这包括 API 级别 13 (Android 3.2) 中用于 mdpi 和 hdpi 之间的屏幕。
  • **触摸屏 -** 定义设备可能具有的触摸屏类型。可能的值是 stylus(适用于手写笔的电阻式触摸屏)、finger(触摸屏)和 notouch(无触摸屏)。
  • **键盘可用性 -** 定义可用的键盘类型。键盘可用性可能会在应用程序的生命周期中发生变化 - 例如,当用户打开键盘时。值包括:
    • **keysexposed -** 当设备具有硬件键盘时定义 keysexposed 限定符。如果没有启用任何软件键盘,则当硬件键盘打开时使用 keysexposed。
    • **keyshidden -** 当设备具有硬件键盘但不可见且未启用任何软件键盘时,使用 keyshidden 限定符。
    • **keyssoft -** 当设备启用了软件键盘时,使用 keyssoft 限定符。
  • **主要文本输入方法 -** 此限定符用于指定可用于输入的硬件键类型。可能的值是:
    • **nokeys -** 没有用于输入的硬件键。
    • **qwerty -** 有一个 QWERTY 键盘可用。
    • **12key -** 有一个 12 键硬件键盘。
  • **导航键可用性 -** 对于 5 向或方向键(d-pad),导航可用。导航键可用性可能会在应用程序的生命周期中发生变化。可能的值是:
    • **navexposed -** 导航键可供用户使用
    • **navhidden -** 不包括导航键。
  • **主要非触控导航方法 -** 设备上可用的导航类型。可能的值是:
    • **nonav -** 唯一可用的导航功能是触摸屏
    • **d-pad -** d-pad(方向键)可用于导航
    • **trackball -** 设备具有用于导航的轨迹球
    • **wheel -** 不常见的情况,其中有一个或多个方向轮可用
  • **平台版本 (API 级别) -** 平台版本由设备支持,格式为 vN,其中 N 是正在定位的 API。例如,v11 定位 API 级别 11 设备。

Android 决定使用哪些资源

Android 应用程序包含许多资源。在这里我们将研究 Android 在设备上运行时如何为应用程序选择资源。

Android 通过迭代测试规则来显示资源的基础

  • **消除相互矛盾的限定符 -** 例如,如果设备的屏幕方向是纵向,则横向资源目录将被驳回。
  • **忽略不支持的限定符 -** 并非所有限定符都适用于所有 API 级别。如果资源目录包含设备不支持的限定符,则该资源目录将被避免。
  • **识别下一个最高优先级限定符 -** 根据上表,选择下一个最高优先级限定符(从上到下)。
  • **保留任何资源目录的限定符 -** 如果任何资源目录与上述限定符匹配,请选择下一个最高优先级限定符(从上到下)。

当系统查找资源但找不到它们时,它将查找其他资源并对其进行缩放。Android 无法找到默认资源。例如,当 Android 正在查找低密度资源但不可用时,Android 可能会选择高密度版本的资源而不是默认或中密度资源。它这样做是因为,高密度资源可以通过 0.5 的因子测量,这将导致比测量中密度资源(这将需要 0.75 的因子)更少的可见性问题。

**例如:**考虑一个具有以下可绘制资源目录的应用程序

然后应用程序在具有以下配置的设备上运行

法語資源與 en-GB 語言環境衝突,已排除

第一个限定符从限定符表 MCC 和 MNC 中选择。没有包含此限定符的资源目录,因此忽略 MCC/MNC 代码。

下一个限定符选择语言。一些资源与语言代码匹配。所有不与语言代码匹配的资源目录都被拒绝,资源列表现在是:

屏幕方向的下一个限定符是那些与屏幕方向 port 不匹配的资源目录被淘汰。

屏幕密度的限定符是 ldpi,这导致又一个资源目录被排除

结果,Android 将使用资源目录 drawable-en-port-ldpi 中的可绘制资源用于该设备。


下一个主题Xamarin vs Ionic