原文链接:点击打
一旦你创建好了资源文件,即可通过资源ID来引用它们,所有这些IDs都在工程的R类,由aapt工具自动生成。
当你的应用编译时,aapt自动生成R类。它包含所有在res/目录里面的资源文件。每一种资源类型,都有一个R子类。每个该类型的资源都有一个静态整型。这个整型就是资源的ID。
尽管R类保存了所有资源文件的IDs,你也无须到里面查找。一个资源ID通常由以下组成:
A. 资源类型,每一个资源都被分为一组“类型”,比如,string, drawable, layout. 可以查看这里寻找更多信息。
B. 资源名字,也是资源文件名,扩展名除外。或者是XML里面android:name属性值,如果资源只是简单的一个值(比如 string)。
有两种方式可以访问资源:
A. 在code里面:从你的R子类里面获取一个静态整型值。比如:R.string.hello
string是资源类型,hello是资源名字。有很多APIs可以访问你的资源。
B. 在XML里面:使用特定的XML语法,它将对应资源ID。比如:@strin /hello
string是资源类型,hello是名字。你可以使用该语法在XML任何一个地方。
在Code里面访问资源
你可以通过将资源ID作为参数传到方法里面来在code里面使用资源,比如,你可以通过setImageResource()
:使用res/drawable/myimage.png
作为参数来设置一个ImageView
。
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
你可以使用getResources()
来获取一个Resources
,实例,使用Resources
,中方法获取单独则资源。
语法
在code里面引用资源的语法:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>:资源存储的包命(当资源是本应用包名时可以省略)。
<resource_type>:R子类里面的资源类型。
<resource_name>:不带扩展名字的文件名,或者是XML元素里面android:name属性值。
用例
可以使用很多方法获取资源ID,也有很多方法可以返回相关的资源。
下面是访问资源一些例子:
// 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类,它是由aapt工具自动生成。任何修改,在下一次编译都会被覆盖。
从XML中访问资源
在xml文件里面你会经常引用一些已经存在的资源,特别是在layout文件里面,你会经常这样做,比如支持一些字符串或者图片的控件。
下面例子中,就是在layout中增加一个Button控件,使用一个string资源来显示Button的文字。
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/submit" />
语法;
@[<package_name>:]<resource_type>/<resource_name>
<pakcage_name>: 资源存储的包名(若是笨包名,则无需携带)。
<resource_type>: R子类的类型名
<resource_name>: 没有扩展名的文件名,或者在XML里面android:name 属性的值。
在XML中,你使用一个资源引用来给一个value赋值,比如你下面一个资源文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="opaque_red">#f00</color>
<string name="hello">Hello!</string>
</resources>
你可以在layout里面使用上面的string和color资源
<?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" />
注意:string资源在很多情况下都要使用, 在不同语种问题上面,你可以参照 Providing AlternativeResources来创建改变的资源,参照 Localization.,来设定本地化语言。
你甚至可以在xml文件里面创建别名,比如,你可以创建一个drawable文件,是另一个drawable的别名:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/other_drawable" />
别名主要用来一个资源文件被多个xml使用的情况,具体参见:点击打开链接
引用类型属性
style 属性主要是指你可以使用当前theme里面的相关属性。语法和上面相似,只是将@变成了?:
?[<package_name>:][<resource_type>/]<resource_name>
比如,下面就是将textcolor设置为theme里面textColorSecondary 属性的颜色值。
<EditText id="text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="?android:textColorSecondary"
android:text="@string/hello_world" />
由于系统资源知道在该context内该属性资源被使用,因此无需显示的标出类型(全部格式:
?android:attr/textColorSecondary
)。
使用平台资源
Android系统提供了大量的系统定义资源,如layout,wiget,sytles,themes等等,为了访问这些资源,请在资源引用前面加上android包名,如下就是一个使用listview的系统layout:
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));