android中使用数组有种非常简单的方式,在xml中获取,一直以来我都比较排斥这样使用,因为从来没有真正弄懂过,每次需要的时候都是在在网上找一个样板来做,今天花点时间彻底弄懂。
首先来看数组的定义。
创建数组资源
在res的values目录下创建arrays.xml文件
然后在在arrays.xml中使用<string-array>
或者<integer-array>
标签定义数组:
1 |
|
<string-array>
定义的是字符数组,<integer-array>
是整数数组。
引用数组资源
在java代码中引用
1 | Resources res = getResources(); |
在xml中引用
这里以spinner控件为例,因为spinner的entries属性刚好需要的是数组资源
1 | <Spinner |
注意上面引用的时候是@array
。
getResources 带来的 NullPointerException
今天在论坛上看了个帖子 地址是:http://bbs.csdn.net/topics/390506826
大概意思就是:为什么Resources res = getResources();
这一句就是代码提示的错误)会报空指针
当时看了以后觉得有点意思,就认为是父类的某个方法内有东西没有实例。
好奇之下就就在网上 找了下,看了一篇写的挺好的文章 ,地址是: http://blog.csdn.net/macheng365/article/details/6403050
讲的是java变量,初始化快,构造函数的执行顺序。
看到这基本就明白大概出错在哪里了,还是当初的怀疑,成员变量都会在其它方法之前执行,包括构造函数,(除非成员变量调用了某个方法或者对某个类实例)而 getResources()这个方法属于ContextWrapper这个类的,在看看源码瞬间你就懂了。
1 | @Override |
这里的mBase就是context,而context实在哪里赋值的呢
1 | public class ContextWrapper extends Context { |
是在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 | TypedArray ar = context.getResources().obtainTypedArray(R.array.actions_images); |
图片的id就保存在resIds中去了,然后我们就可以引用它(比如用img.setImageResourse(resIds[0])
)来设置图片了。
同理,要想在xml中定义id数组,做法一样。