Android 资源基础知识

几乎所有 Android 应用程序都有某种资源:至少它们通常以 XML 文件的形式具有用户界面布局。 首次创建 Xamarin.Android 应用程序时,默认资源由 Xamarin.Android 项目模板设置:

构成默认资源的五个文件是在“资源”文件夹中创建的:

  • Icon.png – 应用程序的默认图标

  • Main.axml – 应用程序的默认用户界面布局文件。 请注意,虽然 Android 使用 .xml 文件扩展名,但 Xamarin.Android 使用 .axml 文件扩展名。

  • Strings.xml – 一个字符串表,可帮助本地化应用程序

  • AboutResources.txt – 这是没有必要的,可以安全地删除。 它只是简要概述了 Resources 文件夹及其中的文件。

  • Resource.designer.cs – 此文件由 Xamarin.Android 自动生成和维护,并保存分配给每个资源的唯一 ID。 这与用 Java 编写的 Android 应用程序 R.java文件非常相似和完全相同。 它由 Xamarin.Android 工具自动创建,并会不时重新生成。

创建和访问资源

创建资源与将文件添加到有关资源类型的目录一样简单。 下面的屏幕截图显示了已将德国区域设置的字符串资源添加到项目中。 将 Strings.xml 添加到文件时,Xamarin.Android 工具会自动将生成操作设置为 AndroidResource

这样,Xamarin.Android 工具就可以正确编译资源并将其嵌入 APK 文件中。 如果由于某种原因,生成操作未设置为 Android 资源,则将从 APK 中排除文件,并且加载或访问资源的任何尝试都将导致运行时错误,应用程序将崩溃。

此外,请务必注意,虽然 Android 仅支持资源项的小写文件名,但 Xamarin.Android 更宽容:它将支持大写和小写文件名。 图像名称的约定是使用小写和下划线作为分隔符(例如,my_image_name.png)。 请注意,如果短划线或空格用作分隔符,则无法处理资源名称。

将资源添加到项目后,可通过两种方法以编程方式(代码内部)或 XML 文件中使用它们。

以编程方式引用资源

若要以编程方式访问这些文件,请为其分配唯一的资源 ID。 此资源 ID 是在名为 Resource 的特殊类中定义的整数,该文件 Resource.designer.cs 中找到,如下所示:

public partial class Resource
{
    public partial class Attribute
    {
    }
    public partial class Drawable {
        public const int Icon=0x7f020000;
    }
    public partial class Id
    {
        public const int Textview=0x7f050000;
    }
    public partial class Layout
    {
        public const int Main=0x7f030000;
    }
    public partial class String
    {
        public const int App_Name=0x7f040001;
        public const int Hello=0x7f040000;
    }
}

每个资源 ID 都包含在与资源类型相对应的嵌套类中。 例如,将文件 Icon.png 添加到项目中时,Xamarin.Android 更新了 Resource 类,创建名为 Drawable 的嵌套类,该类具有名为 Icon 的常量。 这样,Icon.png 文件在代码中就可以作为 Resource.Drawable.Icon 引用。 不应手动编辑 Resource 类,因为对该类所做的任何更改都将被 Xamarin.Android 覆盖。

以编程方式(在代码中)引用资源时,可以通过使用以下语法的 Resources 类层次结构访问它们:

[<PackageName>.]Resource.<ResourceType>.<ResourceName>
  • PackageName – 提供资源的包,仅在使用其他包中的资源时才是必需的。

  • ResourceType – 这是上述 Resource 类中的嵌套资源类型。

  • 资源名称 – 这是资源的文件名(不含扩展)或 XML 元素中资源的 android:name 属性的值。

从 XML 引用资源

XML 文件中的资源通过以下特殊语法进行访问:

@[<PackageName>:]<ResourceType>/<ResourceName>
  • PackageName – 提供资源的包,仅在使用其他包中的资源时才是必需的。

  • ResourceType – 这是 Resource 类中的嵌套资源类型。

  • 资源名称 – 这是资源的文件名(没有文件类型扩展名)或 XML 元素中资源的属性的值 android:name

例如,布局文件 Main.axml 的内容,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    <ImageView android:id="@+id/myImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/flag" />
</LinearLayout>

此示例有一个 ImageView,它需要一个名为标记的可绘制资源。 其 ImageViewsrc 属性设置为 @drawable/flag。 活动启动时,Android 将在目录内查看名为 flag.png 的文件的目录 Resource/Drawable(文件扩展名可能是另一种图像格式,如 flag.jpg)并加载该文件将其显示在 ImageView 中。 运行此应用程序时,如下图所示:

Localized ImageView