Android 资源的组织和访问
您可以使用更多的项目来构建一个好的 Android 应用程序。 除了为应用程序编码之外,您还需要处理各种其他资源,例如您的代码使用的静态内容,例如位图、颜色、布局定义、用户界面字符串、动画说明等。 这些资源总是单独维护在项目res/目录下的各个子目录中。
本教程将向您解释如何组织应用程序资源、指定替代资源并在应用程序中访问它们。
在 Android Studio 中组织资源
MyProject/ app/ manifest/ AndroidManifest.xml java/ MyActivity.java res/ drawable/ icon.png layout/ activity_main.xml info.xml values/ strings.xml
序号 | 目录 & 资源类型 |
---|---|
1 |
anim/ 定义属性动画的 XML 文件。 它们保存在 res/anim/ 文件夹中,可以从 R.anim 类中访问。 |
2 |
color/ 定义颜色状态列表的 XML 文件。 它们保存在 res/color/ 中并从 R.color 类中访问。 |
3 |
drawable/ 图像文件,如 .png、.jpg、.gif 或 XML 文件,它们被编译成位图、状态列表、形状、可绘制动画。 它们保存在 res/drawable/ 并从 R.drawable 类访问。 |
4 |
layout/ 定义用户界面布局的 XML 文件。 它们保存在 res/layout/ 并从 R.layout 类中访问。 |
5 |
menu/ 定义应用程序菜单的 XML 文件,例如选项菜单、上下文菜单或子菜单。 它们保存在 res/menu/ 并从 R.menu 类访问。 |
6 |
raw/ 以原始形式保存的任意文件。 您需要使用资源 ID(即 R.raw.filename)调用 Resources.openRawResource() 来打开此类原始文件。 |
7 |
values/ 包含简单值的 XML 文件,例如字符串、整数和颜色。 例如,以下是您可以在此目录中创建的资源的一些文件名约定 −
|
8 |
xml/ 可以通过调用 Resources.getXML() 在运行时读取的任意 XML 文件。 您可以在此处保存将在运行时使用的各种配置文件。 |
替代资源
您的应用程序应提供替代资源来支持特定的设备配置。 例如,您应该包括用于不同屏幕分辨率的替代可绘制资源(即图像)和用于不同语言的替代字符串资源。 在运行时,Android 会检测当前的设备配置并为您的应用程序加载适当的资源。
要为一组资源指定特定于配置的替代方案,请执行以下步骤 −
在 res/ 中创建一个以 <resources_name>-<config_qualifier> 形式命名的新目录。这里的 resources_name 将是上表中提到的任何资源,如布局、可绘制等。qualifier 将指定要使用这些资源的单个配置。您可以查看官方文档以获取不同类型资源的完整限定符列表。
将相应的替代资源保存在这个新目录中。 资源文件的名称必须与以下示例中所示的默认资源文件完全相同,但这些文件将具有特定于替代方案的内容。 例如,虽然图像文件名相同,但对于高分辨率屏幕,其分辨率会很高。
下面是一个示例,它为默认屏幕指定图像,为高分辨率屏幕指定替代图像。
MyProject/ app/ manifest/ AndroidManifest.xml java/ MyActivity.java res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png layout/ activity_main.xml info.xml values/ strings.xml
下面是另一个示例,它指定默认语言的布局和阿拉伯语的替代布局。
MyProject/ app/ manifest/ AndroidManifest.xml java/ MyActivity.java res/ drawable/ icon.png background.png drawable-hdpi/ icon.png background.png layout/ activity_main.xml info.xml layout-ar/ main.xml values/ strings.xml
访问资源
在您的应用程序开发期间,您将需要访问您的代码或布局 XML 文件中定义的资源。 以下部分说明了如何在这两种情况下访问您的资源 −
在代码中访问资源
当您的 Android 应用程序被编译时,会生成一个 R 类,其中包含您的 res/ 目录中所有可用资源的资源 ID。您可以使用 R 类使用子目录和资源名称或直接资源 ID 访问该资源。
示例
要访问 res/drawable/myimage.png 并设置 ImageView,您将使用以下代码 −
ImageView imageView = (ImageView) findViewById(R.id.myimageview); imageView.setImageResource(R.drawable.myimage);
这里代码的第一行使用 R.id.myimageview 来获取在 Layout 文件中使用 id myimageview 定义的 ImageView。第二行代码使用 R.drawable.myimage 来获取名称为 myimage 的图像,该图像位于 /res 下的 drawable 子目录中。
示例
考虑下一个示例,其中 res/values/strings.xml 具有以下定义 −
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello, World!</string> </resources>
现在您可以使用资源 ID 在 ID 为 msg 的 TextView 对象上设置文本,如下所示 −
TextView msgTextView = (TextView) findViewById(R.id.msg); msgTextView.setText(R.string.hello);
示例
考虑具有以下定义的布局 res/layout/activity_main.xml −
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout>
此应用程序代码将在 onCreate() 方法中为 Activity 加载此布局,如下所示 −
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
在 XML 中访问资源
考虑以下资源 XML res/values/strings.xml 文件,其中包括颜色资源和字符串资源 −
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
现在您可以在以下布局文件中使用这些资源来设置文本颜色和文本字符串,如下所示 −
<?xml version="1.0" encoding="utf-8"?> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="@color/opaque_red" android:text="@string/hello" />
现在,如果您再次阅读上一章,我已经解释了 Hello World! 示例,我相信您会对本章中解释的所有概念有更好的理解。因此,我强烈建议您查看前一章的工作示例,并检查我是如何在非常基础的层面使用各种资源的。