赞
踩
运用Android SDK进行UI开发时,虽然也可以使用纯代码来完成,但是那种方法对我这种刚学习Android对API还不懂的人来说,能进行类似VB、MFC一样图形化开发自然是最合适不过的。幸好Android也提供了这种方式,在Android工程文件中专门有个res目录用于存放资源,该目录下的资源可以进行可视化的编辑,编写好的资源通过AAPT(Android AssetPackaging Tool)工具自动生成gen目录下的R.java资源索引文件,之后在Java代码和XML资源文件中就可以利用索引来调用资源了。
Android提供了如此便利的资源架构,要想使用它,还是要对他有深入的了解才可以,以下就这阵子对Android资源的学习进行小结来回顾和整理几个问题
Android资源目录结构问题?
Android资源支持哪些类型资源,他们具体的语法和使用规则?
Android资源除了assets目录是与res同级外,其它资源均被放在res/目录下面,该目录下面的资源文件夹并不是随意命名的,需要遵循严格的规范,否则编译生成R.java过程中会报类似“invalidresource directory name **”的错误提示,并且导致R.java自动生成失败。
常用的缺省目录和对应资源类型在SDK帮助中有表格列出,简单摘抄如下
目录Directory |
资源类型Resource Types |
res/animator |
存放定义了property animations(android 3.0新定义的动画框架)的XML文件 |
res/anim/ |
存放定义了补间动画(tweened animation)或逐帧动画(frame by frame animation)的XML文件。(该目录下也可以存放定义property animations的XML文件,但是最好还是分开存放) |
res/raw/ |
存放直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename。 |
res/drawable/ |
存放能转换为绘制资源(Drawable Resource)的位图文件(后缀为.png, .9.png, .jpg, .gif的图像文件)或者定义了绘制资源的XML文件 |
res/color/ |
存放定义了颜色状态列表资源(Color State List Resource)的XML文件 |
res/layout/ |
存放定义了用户界面布局的XML文件 |
res/menu/ |
存放定义了应用程序菜单资源的XML文件 |
res/values/ |
存放定义了多种类型资源的XML文件 这些资源的类型可以是字符串,数据,颜色、尺寸、样式等等,具体在后面详述 |
res/xml/ |
存放任意的XML文件,在运行时可以通过调用Resources.getXML()读取 |
上面说过res文件夹下的文件夹命名是有规矩的,否则会报类似“invalidresource directory name **”的错误提示,除了上表提供的缺省文件夹,一般可以用缺省文件夹名加短横线加配置相关的限定符构成需要的资源文件夹,用于区别不同屏幕分辨率、不同机型特点(是否带键盘等)以及不同的本地化资源等用处,详细参考API说明文档。具体案例如下图所示
其中的values-zh-rCN就是中文简体资源包,用于本地化,至于其它就对照API说明文档来分析。一般项目缺省的资源文件夹名称就够了。
由上面资源表可知,每个文件夹中存放的文件类型不仅有规定,而且对文件内容也是有严格要求的,曾经将一个定义布局的spinner.xml文件放置在res/values,结果就报“Invalid start tag *Layout spinner.xml”错误,并导致R.java没有生成;将该布局文件放置在res/color下面,虽然没有报错,但是原本的布局文件,不再是正确生成为形如“R.layout.spinner”的布局资源,而是生成为了“R.color.spinner”的颜色资源索引,具体如下所示
布局文件放置正确的R.java中代码
public static final class layout {
public static final int autocomplete=0x7f030000;
public static final int spinner=0x7f03000d;
}
布局文件放置错误的R.java中代码
public static final class color {
public static final int solid_blue=0x7f050001;
public static final int spinner=0x7f050004;
}
另外当一种资源定义XML文件放在不对应的res文件夹下,在可视化环境下,也就不能正确显示和编辑。
通过上述一些特性,我们可以猜测出android的aapt工具的工作原理,先是根据文件夹名来进行对资源文件和XML文件进行不同的解析和编译规则进行解析和编译,ADT工具也是根据具体文件夹名称调用不同的规则来可视化编辑和呈现。
由于Android资源文件和文件夹有那么多的规矩,所以新手还是建议用eclipseIDE提供的创建XML文件的框架来创建资源文件和资源文件夹即在你需要创建资源文件时,通过“File”“New”“Android XML file”就可以弹出如下的New Android XML File对话框,
选好工程,填好资源文件名,在“What type of resourcewould you like to create”中勾选需要创建的资源类型,假如是非缺省目录资源就在“what type of resource configuration would you like?”添加需要的配置类型,就可以在“Folder”中自动生成资源xml所在的文件夹,这个不用修改它。其它就根据需要来选择,然后点击“Finish”,就可以创建出符合规则的资源文件了。在这里需要注意的是资源文件名不能使用大写字母。
是不是很省事,又能做出正确的事情啊,呵呵!
上面对Android的资源目录的分析中,已经大致展现了Android资源类型的大致脉络,下面从简单资源先入手详细罗列下具体的资源类型和使用。一般而言,没有明说资源不能在XML资源文件中调用,那么该资源都是既可以在其它XML资源文件中调用又可以在Java代码中调用的。
字符串资源位于/res/values目录下,一般定义为/res/values/strings.xml文件中(文件名随意,但是目录是固定的),主要定义的是应用程序需要用到的字串资源,这和Symbian的字串资源规划类似,不过更加进步了些。当然,你非要在代码中使用字串也可以,但那种方式并不是推荐的。字串资源有String、String Array和Quantity Strings (Plurals)三类,其各自语法和用例稍微有些区别
<?xml version="1.0"encoding="utf-8"?>
<resources>
<string name="string_name">text_string</string>
</resources>
上面的string_name字符串资源,可以通过如下两种方法调用
XML资源定义中
@[package:]string/string_name
Java代码中
R.string.string_name
假设有个资源文件为res/values/strings.xml,其内容如下:
<?xml version="1.0"encoding="utf-8"?>
<resources>
<string name="hello">Hello!</string>
</resources>
那么这个hello字串资源在其它XML资源文件中的调用如下所示
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
在java代码中的调用如下
String string = getString(R.string.hello);
<?xml version="1.0"encoding="utf-8"?>
<resources>
<string-array name="string_array_name">
<item>text_string</item>
</string-array>
</resources>
上面的string_array_name字符串资源,可以通过如下两种方法调用
XML资源定义中
@[package:]array/string_array_name
Java代码中
R.array.string_array_name
假设有个String Array资源在/res/values/stringArray.xml中,内容如下
<?xml version="1.0"encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
</resources>
那么在其它资源XML文件中,假设有个下拉列表需要用到上面的字符串数组资源,则可以如下调用
<Spinnerandroid:id="@+id/spinner1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/planets_array">
</Spinner>
在Java代码中的调用示例如下
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
<?xml version="1.0"encoding="utf-8"?>
<resources>
<plurals name="plural_name">
<item quantity=["zero" | "one" | "two"| "few" | "many" |"other"]>text_string</item>
</plurals>
</resources>
帮助文档中没有给出XML资源文件中对其的使用方法,也没有明确说不能通过XML调用,我也没有搞明白这个资源,所以暂时只给出Java代码中对上述plural_name资源的调用情况
R.plurals.plural_name
其中关于zero、one、two、few和many在帮助文档中有详细的释义,这里就不单独罗列。
假设有个Quantity Strings资源定义在/res/values/stringQuantity.xml中,内容如下
<?xml version="1.0"encoding="utf-8"?><resources>
<plurals name="numberOfSongsAvailable">
<item quantity="one">One song found.</item>
<item quantity="other">%d songs found.</item>
</plurals>
</resources>
由于这个资源,我还不太会用,所以只好照抄帮助文档的使用,至于XML文档中如何使用还不会,在Java代码中使用如下所示
int count = getNumberOfsongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);
Android字符串定义时,假如有特殊字符,而没有用到转义字符,就必须用双引号将字符串完全包住,具体如下所示
//正确使用方法
<stringname="good_example">"This'll work"</string>
<stringname="good_example_2">This\'ll also work</string>
//错误
<stringname="bad_example">This won't work!</string>
//错误不可使用html转义字符
<stringname="bad_example_2">This won't work!</string>
由上可知,虽然字符串支持HTML标记,但是不支持html的转义字符。另外对于带格式/风格的字符串资源,也是不能在XML代码中调用,只能在Java代码中使用,而且使用过程中有点复杂,需要用htmlEncode解析,然后用String.format()来实现赋值,接着用fromHtml(String)得到格式化后的string。具体帮助文档给出的用例如下
XML资源定义如下:
<resources>
<string name="welcome_messages">Hello, %1$s! You have<b>%2$d new messages</b>.</string>
</resources>
Java代码调用如下:
String escapedUsername = TextUtil.htmlEncode(username);
Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), escapedUsername,mailCount);
CharSequence styledText = Html.fromHtml(text);
整数常量在C/C++通常是放在代码里面,android将整型常量、Bool常量和数组常量等等都可以放到XML资源文件中,后面具体介绍这些资源时就不再做展开了。一般整数常量被放置在/res/values/integers.xml中,同样文件名可以随意,但是目录必须固定在/res/values/下
<?xml version="1.0"encoding="utf-8"?>
<resources>
<integer name="integer_name">integer</integer>
</resources>
上面的integer_name整数常量,可以通过如下两种方法调用
XML资源定义中
@[package:]integer/integer_name
Java代码中
R.integer.integer_name
假设整数常量放置在/res/values/integers.xml中,内容如下
<?xml version="1.0"encoding="utf-8"?>
<resources>
<integer name="max_speed">75</integer>
<integer name="min_speed">5</integer>
</resources>
我们在代码中使用的时候,通过以下方式进行调用
Resources res = getResources();
int maxSpeed = res.getInteger(R.integer.max_speed);
<?xml version="1.0"encoding="utf-8"?>
<resources>
<integer-array name="integer_array_name">
<item>integer</item>
</integer-array>
</resources>
上面定义的integer_array_name可以用如下两种方法调用
XML资源定义中
@[package:]array.integer_array_name
Java代码中
R.array.integer_array_name
假设整数数组放置在/res/values/intergers.xml中,内容如下所示
<?xml version="1.0"encoding="utf-8"?>
<resources>
<integer-array name="bits">
<item>4</item>
<item>8</item>
<item>16</item>
<item>32</item>
</integer-array>
</resources>
该资源在java代码中的调用为
Resources res = getResources();
int[] bits =res.getIntArray(R.array.bits);
Typed Array资源有点类似于Symbian中瘦模板类的,用于存放多种不同类型资源数组的资源,本来想将这个资源放后面讲解,但是前面提供了一系列数组案例,就一并将这个数组也提前罗列下吧。该资源一般放置于/res/values/arrays.xml中
<?xml version="1.0"encoding="utf-8"?>
<resources>
<array name="typed_array_name">
<item>resource</item>
</array>
</resources>
上面的typed_array_name资源,可以通过如下两种方法调用
XML资源定义中
@[package:]array/typed_array_name
Java代码中
R.array.array_name
假设有两个Typed Array资源定义在/res/values/arrays.xml中,具体如下
<?xml version="1.0"encoding="utf-8"?>
<resources>
<array name="icons">
<item>@drawable/home</item>
<item>@drawable/settings</item>
<item>@drawable/logout</item>
</array>
<array name="colors">
<item>#FFFF0000</item>
<item>#FF00FF00</item>
<item>#FF0000FF</item
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。