Android 应用资源---访问资源(Accessing Resources)

一旦在应用程序中提供了资源,就能够通过引用资源ID来使用资源。所有的资源ID都在工程的R类中被定义,R类是由aapt工具自动生成的。

当应用程序被编译是,aapt会生成R类,它包含了res/目录中的所有资源的资源ID。对于每种类型的资源,会有一个R子类(例如,R.drawable类针对所有可描画资源),并且针对每种类型的资源,都会有一个静态的整数(如,R.drawable.icon)。这个整数就是能够用于获取资源的资源ID

尽管R类是指定资源ID的地方,但是不需要查看它来发现资源ID,一个资源ID始终由以下信息组成:

资源类型:每种资源都被分组到一个类型中,如stringdrawable以及layout等。

资源名称:它既可以是除去扩展名的文件名,也可以是XML文件中android:name属性的值(如果资源是一个像字符串那样的简单值)。

有两种方法能够访问资源:

在代码中:使用来自R类子类的静态整数,如R.string.hellostring是资源类型,hello是资源名称。有一些Android API能够使用这种资源格式访问资源。

XML中:还可以使用相当于R类中定义的资源ID的特殊XML语法,如@string/hello

string资源类型,hello是资源名称。能够在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>

1.<package_name>是要定位的资源所在的包的名字(当引用的资源与代码在同一个包中时,不需要包名)。

2.<resource_type>R的子类,代表资源的类型

3.<resource_name>既可以是不带扩展名的资源文件名,也可以是XML元素中android:name属性值(对简单值资源)

使用场景

有许多接收资源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属性定制值时,能够引用一个既存的资源值。在创建布局资源时,会经常这样做,给weidget提供字符串和图片。

例如,如果在布局中添加一个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中使用资源(如,把一个图片用于Widget的可描画资源),但是可以在任何能够接收简单值的地方使用XML中的资源,如下列资源文件包含了一个颜色资源和字符串资源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   
<colorname="opaque_red">#f00</color>
   
<stringname="hello">Hello!</string>
</resources>

在下面的布局文件中使用上述资源来设置文本的颜色和文本字符串:

<?xml version="1.0" encoding="utf-8"?>
<EditTextxmlns: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"?>
<EditTextxmlns: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中的资源来创建别名,例如,可以创建一个drawable类型的资源,这个资源是另一个drawable类型资源的别名:

<?xml version="1.0" encoding="utf-8"?>
<bitmapxmlns:android="http://schemas.android.com/apk/res/android"
   
android:src="@drawable/other_drawable"/>

引用样式的组件属性

引用样式资源的组件属性允许引用当使用的主题中的一个样式作为属性值。引用样式的组件属性属性通过把样式主题与当前主题所支持的各种标准进行匹配,从而达到定制UI元素外观的效果,而不是提供硬编码值。引用样式的组件属性实际上是,通过这个属性来使用在当前的主题中定义的样式。

要引用样式的组件属性的语法几乎与普通的资源格式完全相同,不同的是@被?所替代,并且资源类型部分是可选的。例如:

?[<package_name>:][<resource_type>/]<resource_name>

例如,以下示例说明了设置文本颜色的一个属性如何能够跟系统主题的“primary”文本颜色相匹配:

<EditTextid="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样式属性值作为widget中的android:textColor的值。因为系统资源工具了解在这个内容中所期望资源属性,所以不需要明确的指定类型(上例中完整的引用应该是?android:attr/textColorSecondary---可以忽略attr类型)

访问平台资源

Android包含很多标准资源,如样式、主题和布局等。要访问这些资源,就要使用完全的android包名来引用资源。如,AndroidListAdapter类中提供了用于列表项的布局资源:

setListAdapter(newArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

在这个列子中,simple_list_item_1是平台给ListView对象中的项目定义的布局资源,可以使用它来替代自己要创建的用于列表项的布局。

你可能感兴趣的:(android,xml,layout,animation,resources,encoding)