在应用中提供资源后,可通过引用其资源 ID 来应用该资源。所有资源 ID 都在您项目的 R 类中定义,后者由 aapt 工具自动生成。
编译应用时,aapt 会生成 R 类,其中包含您的 res/ 目录中所有资源的资源 ID。 每个资源类型都有对应的 R 子类(例如,R.drawable 对应于所有 Drawable 资源),而该类型的每个资源都有对应的静态整型数(例如,R.drawable.icon)。这个整型数就是可用来检索资源的资源 ID。
尽管资源 ID 是在 R 类中指定的,但您应该永远都不需要在其中查找资源 ID。资源 ID 始终由以下部分组成:
访问资源的方法有两种:
您可以通过以方法参数的形式传递资源 ID,在代码中使用资源。例如,您可以设置一个 ImageView,以利用 setImageResource() 使用 res/drawable/myimage.png 资源:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
您还可以利用 Resources 中的方法检索个别资源,您可以通过 getResources() 获得资源实例。
语法
以下是在代码中引用资源的语法:[
是资源所在包的名称(如果引用的资源来自您自己的资源包,则不需要)。
是资源类型的 R 子类。
是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源是简单值)。用例
有许多方法接受资源 ID 参数,您可以利用 Resources 中的方法检索资源。您可以通过 Context.getResources() 获得 Resources 的实例。
以下是一些在代码中访问资源的示例:
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;
getWindow().setTitle(getResources().getText(R.string.main_title));
setContentView(R.layout.main_screen);
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in));
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);
您可以利用对现有资源的引用为某些 XML 属性和元素定义值。创建布局文件时,为给您的小工具提供字符串和图像,您经常要这样做。
例如,如果您为布局添加一个 Button,应该为按钮文本使用字符串资源:
语法
以下是在 XML 资源中引用资源的语法:@[
是资源所在包的名称(如果引用的资源来自同一包,则不需要)
是资源类型的 R 子类
是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源是简单值)。用例
在某些情况下,您必须使用资源作为 XML 中的值(例如,对小工具应用可绘制图像),但您也可以在 XML 中任何接受简单值的地方使用资源。例如,如果您具有以下资源文件,其中包括一个颜色资源和一个字符串资源:
#f00
Hello!
您可以在以下布局文件中使用这些资源来设置文本颜色和文本字符串:
在此情况下,您无需在资源引用中指定包名称,因为资源来自您自己的资源包。 要引用系统资源,您需要加入包名称。 例如:
您甚至可以在 XML 中使用资源创建别名。例如,您可以创建一个 Drawable 资源,将其作为另一个 Drawable 资源的别名:
引用样式属性
您可以通过样式属性资源在当前应用的风格主题中引用某个属性的值。 通过引用样式属性,您可以不采用为 UI 元素提供硬编码值这种方式,而是通过为 UI 元素设置样式,使其匹配当前风格主题提供的标准变型来定制这些元素的外观。引用样式属性的实质作用是,“在当前风格主题中使用此属性定义的样式”。
要引用样式属性,名称语法几乎与普通资源格式完全相同,只不过将 at 符号 (@) 改为问号 (?),资源类型部分为可选项。 例如:?[
例如,您可以通过以下代码引用一个属性,将文本颜色设置为与系统风格主题的“主要”文本颜色匹配:
在以上代码中,android:textColor 属性表示当前风格主题中某个样式属性的名称。Android 现在会使用应用于 android:textColorSecondary 样式属性的值作为 android:textColor 在这个小工具中的值。由于系统资源工具知道此环境中肯定存在某个属性资源,因此您无需显式声明类型(类型应为 ?android:attr/textColorSecondary)— 您可以将 attr 类型排除在外。