android中使用xml里的array资源

android中使用数组有种非常简单的方式,在xml中获取,一直以来我都比较排斥这样使用,因为从来没有真正弄懂过,每次需要的时候都是在在网上找一个样板来做,今天花点时间彻底弄懂。

首先来看数组的定义。

创建数组资源

在res的values目录下创建arrays.xml文件

然后在在arrays.xml中使用<string-array>或者<integer-array>标签定义数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
<item>c语言</item>
<item>java </item>
<item>php</item>
<item>xml</item>
<item>html</item>
</string-array>

<integer-array name="reminder_methods_values" translatable="false">
<item>1</item>
<item>2</item>
<item>3</item>
</integer-array>

</resources>

<string-array>定义的是字符数组,<integer-array>是整数数组。

引用数组资源

在java代码中引用

1
2
3
Resources res = getResources();
String[] languages = res.getStringArray(R.array.languages);
String[] reminder_methods = res.getIntArray(R.array.reminder_methods_values);

在xml中引用

这里以spinner控件为例,因为spinner的entries属性刚好需要的是数组资源

1
2
3
4
5
6
<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/languages"
/>

注意上面引用的时候是@array


getResources 带来的 NullPointerException

今天在论坛上看了个帖子 地址是:http://bbs.csdn.net/topics/390506826

大概意思就是:为什么Resources res = getResources();这一句就是代码提示的错误)会报空指针

当时看了以后觉得有点意思,就认为是父类的某个方法内有东西没有实例。

好奇之下就就在网上 找了下,看了一篇写的挺好的文章 ,地址是: http://blog.csdn.net/macheng365/article/details/6403050
讲的是java变量,初始化快,构造函数的执行顺序。

看到这基本就明白大概出错在哪里了,还是当初的怀疑,成员变量都会在其它方法之前执行,包括构造函数,(除非成员变量调用了某个方法或者对某个类实例)而 getResources()这个方法属于ContextWrapper这个类的,在看看源码瞬间你就懂了。

1
2
3
4
@Override
publicResources getResources(){
returnmBase.getResources();
}

这里的mBase就是context,而context实在哪里赋值的呢

1
2
3
4
5
6
7
public class ContextWrapper extends Context {

Context mBase;

publicContextWrapper(Context base) {
mBase = base;
}

是在ContextWrapper的构造函数里!!!

所以不是this为null,而是context为null,this是本类的一个引用而已。

当然如果你把这句话放在onCreate方法的任何地方都是可以的,这时候context已经生成。


在xml文件中定义drawable数组、id数组等

假如我们需要在代码中为一组view设置相对应的一组图片资源时(如为listview/gridview的所有item设置一组对应的图片时),我们就可以在xml中定义一组代表图片的drawable数组,然后用代码进行读取。

开始我是这样做的:

@drawable/pencil1
@drawable/pencil2
@drawable/pencil3
@drawable/pencil4
@drawable/pencil5
@drawable/pencil6

然后在代码中试图调用getResources().getIntArray来获取图片的id,可发现根本行不通。最终查stackoverflow给出了解决办法:

1、在xml中要这样定义:

@drawable/pencil1
@drawable/pencil2
@drawable/pencil3
@drawable/pencil4
@drawable/pencil5
@drawable/pencil6

2、在java代码中这样来获取:

1
2
3
4
5
6
7
TypedArray ar = context.getResources().obtainTypedArray(R.array.actions_images);
int len = ar.length();
int[] resIds = new int[len];
for (int i = 0; i < len; i++)
resIds[i] = ar.getResourceId(i, 0);

ar.recycle();

图片的id就保存在resIds中去了,然后我们就可以引用它(比如用img.setImageResourse(resIds[0]))来设置图片了。

同理,要想在xml中定义id数组,做法一样。