android应用资源概览

网友投稿 746 2022-05-30

应用资源概览

资源是指代码使用的附加文件和静态内容,例如位图、布局定义、界面字符串、动画说明等。

您应始终外部化应用资源(例如图像和代码中的字符串),以便单独对其进行维护。此外,您还应为特定设备配置提供备用资源,方法是将其进行分组并放入专门命名的资源目录中。在运行时,Android 会根据当前配置使用合适的资源。例如,您可能需根据屏幕尺寸提供不同的界面布局,或根据语言设置提供不同的字符串。

外部化应用资源后,您便可使用在项目 R 类中生成的资源 ID 来访问这些资源。本文档会介绍如何对 Android 项

分组资源类型

您应将各类资源放入项目 res/ 目录的特定子目录中。例如,以下是一个简单项目的文件层次结构:

MyProject/ src/ MyActivity.java res/ drawable/ graphic.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml

如此示例所示,res/ 目录包含所有资源(在子目录中):一个图像资源、两个布局资源、启动器图标的 mipmap/ 目录以及一个字符串资源文件。资源目录名称非常重要,具体说明请见表 1。

**请注意:**如需了解有关使用 mipmap 文件夹的详细信息,请参阅管理项目概览。意:**切勿将资源文件直接保存在 res/ 目录内,因为这样会造成编译错误。

如需了解有关特定资源类型的详细信息,请参阅资源类型文档。

在表 1 定义的子目录中,保存的资源为“默认”资源。换言之,这些资源定义应用的默认设计和内容。然而,不同类型的 Android 设备可能需要不同类型的资源。例如,如果设备屏幕比标准屏幕大,则应提供不同的布局资源,从而充分利用额外的屏幕空间。或者,如果设备的语言设置不同,则应提供不同的字符串资源,以便将界面中的文本转换为其他语言。如要为不同设备配置提供这些不同资源,除默认资源以外,您还需提供备用资源。

提供备用资源

几乎每个应用都应提供备用资源,以便支持特定的设备配置。例如,对于不同的屏幕密度和语言,您应分别加入备用可绘制对象资源和备用字符串资源。在运行时,Android 会检测当前设备配置并为应用加载合适的资源。

图 1. 两种不同的设备,均使用不同的布局资源。

为一组资源指定配置特定的备用资源:

res/

中创建以

-

形式命名的新目录。

是相应默认资源的目录名称(如表 1 中所定义)。

是指定要使用这些资源的各个配置的名称(如表 2 中所定义)。

您可以追加多个 。以短划线将其分隔。

**注意:**追加多个限定符时,必须按照表 2 中列出的相同顺序放置限定符。如果限定符的顺序错误,则该资源将被忽略。

将相应的备用资源保存在此新目录下。这些资源文件必须与默认资源文件完全同名。

例如,以下是一些默认资源和备用资源:

res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png

hdpi 限定符表示该目录中的资源适用于屏幕密度较高的设备。其中,每个可绘制对象目录中的图像均已针对特定的屏幕密度调整了大小,但文件名完全相同。如此一来,用于引用 icon.png 或 background.png 图像的资源 ID 始终相同,但 Android 会通过将设备配置信息与资源目录名称中的限定符进行比较,选择最符合当前设备的各个资源版本。

Android 支持若干配置限定符,您可以通过使用短划线分隔每个限定符,从而向一个目录名称添加多个限定符。表 2 按优先级顺序列出了有效的配置限定符;如果对资源目录使用多个限定符,则必须按照表中所列顺序将其添加到目录名称中。

**请注意:**自 Android 1.0 起便已添加部分配置限定符,因此并非所有版本的 Android 系统都支持所有限定符。使用新限定符会隐式添加平台版本限定符,因此较旧版本系统的设备必然会忽略它。例如,使用 w600dp 限定符会自动包括 v13 限定符,因为可用宽度限定符是 API 级别 13 中的新增配置。为避免出现任何问题,请始终包含一组默认资源(一组不带限定符的资源)。如需了解详细信息,请参阅利用资源提供最佳设备兼容性部分。

限定符命名规则

以下是一些关于使用配置限定符名称的规则:

您可以为单组资源指定多个限定符,并使用短划线分隔。例如,drawable-en-rUS-land 适用于屏幕方向为横向的美国英语设备。

这些限定符必须遵循中列出的顺序。例如:

错误:drawable-hdpi-port/

正确:drawable-port-hdpi/

不能嵌套备用资源目录。例如,您的目录不能为 res/drawable/drawable-en/。

值不区分大小写。在处理之前,资源编译器会将目录名称转换为小写,以免不区分大小写的文件系统出现问题。名称中使用的所有大写字母只是为了便于认读。

每种限定符类型仅支持一个值。例如,若要对西班牙语和法语使用相同的可绘制对象文件,则您不能拥有名为 drawable-rES-rFR/ 的目录,而是需要两个包含相应文件的资源目录,如 drawable-rES/ 和 drawable-rFR/。然而,您实际无需在两处复制相同的文件。相反,您可以创建指向资源的别名。请参阅下面的创建别名资源。

在将备用资源保存到以这些限定符命名的目录中后,Android 会根据当前设备配置在应用中自动应用这些资源。每次请求资源时,Android 都会检查备用资源目录是否包含所请求的资源文件,然后查找最佳匹配资源(下文进行介绍)。如果没有与特定设备配置相匹配的备用资源,则 Android 会使用相应的默认资源(一组用于不含配置限定符的特定资源类型的资源)。

创建别名资源

如果您想将某一资源用于多种设备配置(但不想以默认资源的形式提供该资源),则无需将同一资源放入多个备用资源目录中。相反,您可以(在某些情况下)创建备用资源,充当默认资源目录中所保存资源的别名。

**请注意:**并非所有资源都会提供相应机制,以便您创建指向其他资源的别名。特别是,xml/ 目录中的动画资源、菜单资源、原始资源及其他未指定资源均不提供此功能。

例如,假设您有一个应用图标 icon.png,并且需要用于不同语言区域的独特版本。但是,加拿大英语和加拿大法语这两种语言区域需使用同一版本。您可能会认为,需要将相同图像复制到加拿大英语和加拿大法语所对应的资源目录中,但事实并非如此。相反,您可以将用于二者的图像保存为 icon_ca.png(除 icon.png 以外的任何名称),并将其放入默认的 res/drawable/ 目录中。然后,在 res/drawable-en-rCA/ 和 res/drawable-fr-rCA/ 中创建 icon.xml 文件,使用 元素引用 icon_ca.png 资源。这样,您只需存储 PNG 文件的一个版本和两个指向该版本的小型 XML 文件。(XML 文件示例如下。)

如要创建指向现有可绘制对象的别名,请使用 元素。例如:

@drawable/icon_ca

如果将此文件保存为 drawables.xml(例如,在备用资源目录中保存为 res/values-en-rCA/),则系统会将其编译到可作为 R.drawable.icon 引用的资源中,但该文件实际是 R.drawable.icon_ca 资源(保存在 res/drawable/ 中)的别名。

如要创建指向现有布局的别名,请使用包装在 中的 元素。例如:

如果将此文件保存为 main.xml,则系统会将其编译到可作为 R.layout.main 引用的资源中,但该文件实际是 R.layout.main_ltr 资源的别名。

如要创建指向现有字符串的别名,您只需将所需字符串的资源 ID 用作新字符串的值。例如:

Hello @string/hello

R.string.hi 资源现在是 R.string.hello 的别名。

其他简单值的原理相同。例如,颜色:

#f00 @color/red

访问应用资源

在应用中提供资源后,您可通过引用其资源 ID 来应用该资源。所有资源 ID 都在您项目的 R 类中进行定义,该类由 aapt 工具自动生成。

编译应用时,aapt 会生成 R 类,其中包含 res/ 目录中所有资源的资源 ID。每个资源类型都有对应的 R 子类(例如,R.drawable 对应所有可绘制对象资源),而该类型的每个资源都有对应的静态整型数(例如,R.drawable.icon)。该整型数就是可用来检索资源的资源 ID。

尽管资源 ID 是在 R 类中指定的,但您完全不需要在该类中查找资源 ID。资源 ID 始终由以下部分组成:

资源类型:每个资源都被分到一个“类型”组中,例如 string、drawable 和 layout。如需了解有关不同类型的详细信息,请参阅资源类型。

资源名称,它是不包括扩展名的文件名;或是 XML android:name 属性中的值(如资源是字符串等简单值)。

访问资源的方法有两种:

在代码中:

使用来自

R

类子类的静态整型数,例如:

R.string.hello

string 为资源类型,hello 为资源名称。当您提供此格式的资源 ID 时,有许多 Android API 可以访问您的资源。请参阅在代码中访问资源。

在 XML 中:

使用同样与

R

类中所定义资源 ID 对应的特殊 XML 语法,例如:

@string/hello

string 为资源类型,hello 为资源名称。只要 XML 资源中的某处拥有您在资源中提供的值,则您便可在该 XML 资源中使用此语法。请参阅在 XML 中访问资源。

在代码中访问资源

您可以以方法参数的形式传递资源 ID,进而在代码中使用资源。例如,您可以设置一个 ImageView,从而借助 setImageResource() 使用 res/drawable/myimage.png 资源:

val imageView = findViewById(R.id.myimageview) as ImageView imageView.setImageResource(R.drawable.myimage)

您还可利用 Resources 中的方法检索个别资源,并且您可通过 getResources() 获得该资源的实例。

以下是在代码中引用资源的语法:

[.]R..

是资源所在包的名称(如果引用的资源来自您自己的资源包,则不需要)。

是资源类型的 R 子类。

是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(若资源是简单值)。

如需了解有关各资源类型及其引用方法的详细信息,请参阅资源类型。

许多方法可接受资源 ID 参数,您可利用 Resources 中的方法检索资源。您可以通过 Context.getResources() 获得 Resources 的实例。

以下是一些在代码中访问资源的示例:

// Load a background for the current screen from a drawable resource window.setBackgroundDrawableResource(R.drawable.my_background_image) // Set the Activity title by getting a string from the Resources object, because // this method requires a CharSequence rather than a resource ID window.setTitle(resources.getText(R.string.main_title)) // Load a custom layout for the current screen setContentView(R.layout.main_screen) // Set a slide in animation by getting an Animation from the Resources object flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in)) // Set the text on a TextView object using a resource ID val msgTextView = findViewById(R.id.msg) as TextView msgTextView.setText(R.string.hello_message)

**注意:**切勿手动修改 R.java 文件 — 在您编译项目时,aapt 工具会生成该文件。下次编译时,所有更改都会被覆盖。

在 XML 中访问资源

您可以使用对现有资源的引用,为某些 XML 属性和元素定义值。创建布局文件时,为给您的微件提供字符串和图像,您会经常这样做。

例如,如果您为布局添加 Button,则应为按钮文本使用字符串资源:

上一篇:Vue进阶(幺柒捌):延伸阅读Sass、Scss、Less与Stylus编程特性
下一篇:使用 Python Poetry 进行依赖管理
相关文章