访问资源
在应用程序中提供资源(在提供资源中讨论)后,可以通过引用其资源ID来应用它。所有资源ID都在项目的R类中定义,aapt工具会自动生成。
编译应用程序时,aapt会生成R类,其中包含res /目录中所有资源的资源ID。对于每种类型的资源,都有一个R子类(例如,所有可绘制资源的R.drawable),对于该类型的每个资源,都有一个静态整数(例如,R.drawable.icon)。此整数是可用于检索资源的资源ID。
虽然R类是指定资源ID的位置,但您永远不需要在那里查找资源ID。资源ID始终由以下内容组成:
- 资源类型:每个资源都分组为“类型”,例如字符串,可绘制和布局。有关不同类型的更多信息,请参阅资源类型。
- 资源名称,可以是:文件名,不包括扩展名;或者XML android:name属性中的值,如果资源是一个简单值(例如字符串)。
您可以通过两种方式访问资源:
- 在代码中:使用R类的子类中的静态整数,例如:R.string.hello
string是资源类型,hello是资源名称。当您以此格式提供资源ID时,有许多Android API可以访问您的资源。请参阅访问代码中的资源。
- 在XML中:使用特殊的XML语法,该语法也对应于R类中定义的资源ID,例如:@string/hello
string是资源类型,hello是资源名称。您可以在XML资源中将此语法用于您在资源中提供的值的任何位置。请参阅从XML访问资源。
访问代码中的资源
您可以通过将资源ID作为方法参数传递来在代码中使用资源。例如,您可以使用setImageResource()将ImageView设置为使用res / drawable / myimage.png资源:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
您还可以使用参考资料中的方法检索单个资源,您可以使用getResources()获取实例。
语法
以下是在代码中引用资源的语法:
[<package_name>.]R.<resource_type>.<resource_name>
- <package_name>是资源所在的程序包的名称(在引用自己的程序包中的资源时不需要)。
- <resource_type>是资源类型的R子类。
- <resource_name>是没有扩展名的资源文件名或XML元素中的android:name属性值(对于简单值)。
有关每种资源类型以及如何引用它们的详细信息,请参阅资源类型。
访问原始文件
虽然不常见,但您可能需要访问原始文件和目录。如果这样做,那么在res /中保存文件将不适合您,因为从res /读取资源的唯一方法是使用资源ID。相反,您可以将资源保存在assets /目录中。保存在assets /目录中的文件未获得资源ID,因此您无法通过R类或XML资源引用它们。相反,您可以像普通文件系统一样查询assets /目录中的文件,并使用AssetManager读取原始数据。
但是,如果您只需要能够读取原始数据(例如视频或音频文件),则将文件保存在res / raw /目录中,并使用openRawResource()读取字节流。
用例
有许多方法接受资源ID参数,您可以使用Resources中的方法检索资源。您可以使用Context.getResources()获取Resources的实例。
以下是访问代码中资源的一些示例:
// Load a background for the current screen from a drawable resource
getWindow().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
getWindow().setTitle(getResources().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
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.hyperspace_in));
// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);
警告:您不应该手动修改R.java文件 - 它是在编译项目时由aapt工具生成的。下次编译时会覆盖任何更改。
从XML访问资源
您可以使用对现有资源的引用为某些XML属性和元素定义值。在创建布局文件时,通常会这样做,为小部件提供字符串和图像。
例如,如果向布局添加Button,则应使用按钮文本的字符串资源:
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/submit" />
语法
以下是引用XML资源中的资源的语法:
@[<package_name>:]<resource_type>/<resource_name>
- <package_name>是资源所在的程序包的名称(在引用同一程序包中的资源时不需要)
- <resource_type>是资源类型的R子类
- <resource_name>是没有扩展名的资源文件名或XML元素中的android:name属性值(对于简单值)。
有关每种资源类型以及如何引用它们的详细信息,请参阅资源类型。
用例
在某些情况下,您必须将资源用于XML中的值(例如,将可绘制图像应用于窗口小部件),但您也可以在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" />
在这种情况下,您不需要在资源引用中指定包名称,因为资源来自您自己的包。要引用系统资源,您需要包含程序包名称。例如:
<?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="@android:color/secondary_text_dark"
android:text="@string/hello" />
注意:您应始终使用字符串资源,以便可以将应用程序本地化为其他语言。有关创建备用资源(例如本地化字符串)的信息,请参阅提供备用资源。有关本地化其他语言的应用程序的完整指南,请参阅本地化。
您甚至可以使用XML中的资源来创建别名。例如,您可以创建一个可绘制资源,该资源是另一个可绘制资源的别名:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/other_drawable" />
这听起来多余,但在使用替代资源时非常有用。阅读有关创建别名资源的更多信息。
引用样式属性
样式属性资源允许您在当前应用的主题中引用属性的值。引用样式属性允许您通过设置UI元素的样式来自定义UI元素的外观,以匹配当前主题提供的标准变体,而不是提供硬编码值。引用样式属性实质上是说,“在当前主题中使用由此属性定义的样式。”
要引用样式属性,名称语法几乎与普通资源格式相同,但使用问号(?)代替at符号(@),资源类型部分是可选的。例如:
?[<package_name>:][<resource_type>/]<resource_name>
例如,以下是如何引用属性以设置文本颜色以匹配系统主题的“主要”文本颜色:
<EditText id="text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="?android:textColorSecondary"
android:text="@string/hello_world" />
这里,android:textColor属性指定当前主题中样式属性的名称。 Android现在使用应用于android:textColorSecondary样式属性的值作为此窗口小部件中android:textColor的值。因为系统资源工具知道在此上下文中需要属性资源,所以您不需要显式声明类型(可能是?android:attr / textColorSecondary) - 您可以排除attr类型。
访问平台资源
Android包含许多标准资源,例如样式,主题和布局。要访问这些资源,请使用android软件包名称限定资源引用。例如,Android提供了一个可用于ListAdapter中列表项的布局资源:
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
在此示例中,simple_list_item_1是平台为ListView中的项定义的布局资源。您可以使用它而不是为列表项创建自己的布局。有关更多信息,请参阅列表视图开发人员指南。