第2章 资源访问
一旦你在你的应用程序中提供了一个资源(在上一章资源提供中讨论过),你可以通过引用它的资源ID来调用它。所有在工程项目中R类中定义的资源ID都是能过aapt自动生成的。
当你的应用程序被编译时,aapt生成了R类,其中包含了res/路径下所有资源的资源ID。对于每种类型的资源,都有的一R类的子类(如:R.drawable对应绘图<drawable>资源)并且对于每一种资源类型,都有一个静态整型常量(如,R.drawable.icon)。这个整型常量就是可以被用来调用资源的资源ID。
虽然资源ID是在R类中指定的,但你并不需要去那儿找资源ID。一个资源ID总是由以下部分组成:
◆资源类型:每一个资源都是以某种“类型”分组的,如字符串<string>,绘图<drawable>,以及布局<layout>。
◆资源名:即文件名,包括其括展名;或者,如果资源只是一个基本类型值(如一个字符串<string>),则是在XML中android:name属性的值。
访问一个资源有两种方法:
◆在代码中:使用一个R类的子类中的一个静态整型值,如:
R.string.hello
string是资源类型,hello是资源名。当你提供一个这种格式的资源类型时,有很多的Android API可以访问你你的资源。
◆在XML中:使用一个特殊的XML语法,对应R类中定义的资源ID,如:
@string/hello
string是资源类型,hello是资源名。你可以在XML中任意一个需要的地方使用这个语法。
2.1 在代码中访问资源
你可以在代码中把资源ID传递给人个方法的参数来使用了一资源。例如,你可以通过setImageResource()设置一个ImageView来使用res/drawable/myimage.png资源,如代码清单2-1所示:
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
代码清单2-1
你也能使用Resources中的方法来检索独立的资源,使用getResources()来获得一个实例。
2.1.1访问原始文件
偶尔,你可能需要访问原始文件和路径。如果你这么做了,那么你保存在res/中的文件将不会为你所用,因为唯一一个读取res/中资源的方法就是通过其资源ID。不过,你可以把你的资源保存在assets/路径下。被保存在assets/路径下的文件将不会得到一个资源ID,所以你不可以能过R类或是XML来引用它们。不过,你可以像普通的文件系统一样,查询assets/路径下的文件,并且使用AssetManager来读取原始的未经处理的数据。然而,如果你所要求的是读取原始的未经处理的数据(如一个视频或音频文件),那么,把文件保存在res/raw/路径下,并通过openRawResource()来读取一个字节流。
2.1.2语法
这是在代码中引用一个资源的语法:
[<package_name>.]R.<resource_type>.<resource_name>
<package_name>是资源所在的包名(如果被引用的资源在你自己的包中,不需要指明)。
<resource_type>是R的子类中资源的类型。
<resource_name>是不包括扩展名的资源文件名或XML元素中android:name属性的值(基本类型)。
2.1.3使用案例
有很多种方法可以接受一个资源ID参数,你可以使用Resources中的方法来检索资源。你可以通过Context.getResources()来获得Resources的一个实例。
以下是在代码中访问资源的一些实例,如代码清单2-2所示:
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);
代码清单2-2
注意:你永远不要手动修改R.java文件——它是在项目被编译时由aapt生成的。任何的改变将在下一次编译时被重写。
2.2 通过XML访问资源
你可以使用一个已存在的资源的引用来定义一些XML的属性和元素的值。当你创建布局文件时将会经常使用到这个方法为你的小部件提供字符串和图片。例如,你为你的布局添加一个Button,你应该使用字符串资源作为button的文字,如代码清单2-3所示:
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/submit" />
代码清单2-3
2.2.1语法
以下是XML中引用一个资源的语法:
@[<package_name>:]<resource_type>/<resource_name>
<package_name>是资源所在的包名(如果被引用的资源在你自己的包中,不需要指明)。
<resource_type>是R的子类中资源的类型。
<resource_name>是不包括扩展名的资源文件名或XML元素中android:name属性的值(基本类型)。
2.2.2使用案例
在一些情况下,你必须使用一个资源作为XML中的一个值(如,为一个小部件提供一个图片),但是,你可以在XML中任意一个可以接受一个基本类型值的地方使用一个资源。例如,假如你有以下资源文件,包括了一个颜色启动和一个字符串资源,如代码清单2-4所示:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="opaque_red">#f00</color> <string name="hello">Hello!</string> </resources>
代码清单2-4
你可以在以下的布局文件中使用这些资源来设置文本颜色和文本字符串,如代码清单2-5所示:
<?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" />
代码清单2-5
在这个案例中,在资源引用时,你不需要指名包名,因为这些资源来自于你自己的包。引用一个系统资源,你需要包括一个包名。如代码清单2-6所示:
<?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" />
代码清单2-6
注意:你应该始终都可以使用用字符串资源,这样你的应用就可以被其他语言定位。
你甚至可以在XML中创建化名。例如,你可以创建一个绘图资源,作为另一个绘图资源的化名,如代码清单2-7所示:
<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/other_drawable" />
代码清单2-7
这个听起来无用,但在使用可选资源时将会非常有用。
2.2.3应用风格属性
一个样式属性资源允许你引用一个当前使用主题中某个属性的值。引用一个样式属性允许你定制UI元素的外观,通过样式化他们来匹配当前主题提供的标准化的变化,而不是提供一个硬编码值。引用一个样式属性本质上说的是,“在当前主题下,使用一个被这个属性所定义的样式。”
引用一个样式属性,其命名的语法几乎是与一般资源的格式相同,但是,使用一个问号(?)来替代@符号,并且资源类型部分是可选的。如:
?[<package_name>:][<resource_type>/]<resource_name>
例如,这里是一个例子,展示了如何引用一个属性来设定文本颜色以匹配系统主题“主要的”文本颜色,如代码清单2-8所示:
<EditText id="text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="?android:textColorSecondary" android:text="@string/hello_world" />
代码清单2-8
其中,android:textColor属性指定了当前主题中,一个样式属性的名字。在这个小部件中,Android将使用android:textColorSecondary样式属性的值作为android:textColor的值。因为系统资源工具知道,在这个环境下需要一个属性资源,你并不需要明确的指定其类型(需要可以这样定义?android:attr/textColorSecondary)-你可以排除attr类型。
2.3 访问平台资源
Android包含了很多标准化资源,如,样式、主题和布局。要访问这些资源,在你的资源引用中需要包括其android包名。例如,在ListAdapter中,Android提供了一个你可以用作列举项目的布局资源,如代码清单2-9所示:
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));
在这个范例中,simple_list_item_1是一个布局资源,在ListView中,为了项目由平台所定义。你可以使用这个资源而不用创建一个自己的布局来列举项目。
本文来自jy02432443,是本人辛辛苦苦一个个字码出来的,转载请保留出处,并保留追究法律责任的权利 QQ78117253