在上一次学习笔记中,学习了XML文件的解析,实际上一些简单的activity属性,一些简单的信息,我们也可以放入xml文件中,可以直接放入res/vaules,由系统来进行解析,而无须使用XmlPullParser来自己分析。
Dimension
用于字体大小,间距pading等等。常用的尺寸大小详细见Android 学习笔记(十四):Activity-AutoCompleteTextView,一般我们使用dip/dp和sp,因为和in(inch),mm,以及px(像素点)不同,它和物理屏幕尺寸大小,像素密度无关。
在res/values下面增加一个xml文件,名字无所谓:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="thin">10px</dimen>
<dimen name="fat">36sp</dimen>
</resources>
如果我们在layout文件中调用:<TextView .... android:textSize="@dimen/fat" />;如果我们在java源代码中调用:line1.setTextSize(getResources().getDimension(R.dimen.thin));
Color
同样颜色也可以在resource文件中设置,颜色的格式为#RGB,#ARGB,#RRGGBB,#AARRGGBB,采用16进制方式。同样在res/values下任一个xml文件,写法如下:
<resources>
<color name="yellow_orange">#FF5555</color>
<color name="forest_green">#005500</color>
</resources>
如果我们在layout文件中调用:<TextView ... android:textColor="@color/forest_green" />;如果我们在java源代码中调用:line1.setTextColor(getResources().getColor(R.color.yellow_orange));
Array
以前在ListActivity中已经有类似的用法,同样可以在res/values的xml下面设置数组。方式如下:
<resources>
<string-array name="cities">
<item>Philadelphia</item>
<item>Pittsburgh</item>
<item>Allentown/Bethlehem</item>
<item>Erie</item>
</string-array>
</resources>
在Java源代码中,可以通过String[] cities = getResources().getStringArray(R.array.cities);来获取。一个常用的方式是设置List的item,例如setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,cities));
不同情况的处理
对于应用,我们需要为不同对象设置不同处理情况,例如国际语言版本,本地语言版本,此外由于Android的设备种类繁多,要考虑到屏幕的方向(横屏、竖屏,支持还是不支持屏幕旋转),屏幕大小和分辨率,是否支持触摸屏,是否有键盘(数字的还是QWERTY),有某其他的输入设备(例如D-Pad,就是方向键,在feature phone中很常见)。Android处理则这些情况是通过多个资源目录,目录名称有规定,表示适配不同的情况。
对不同语言的适配处理:放置在res/values/strings.xml中为缺省的strings,特定的语言,例如英语、西班牙语,分别对应res/values-en/strings.xml和res/values-es/strings.xml。Android系统会根据系统的语言选择去自动进行适配,如果没有特定的语言,则采用缺省目录。values-xx中的xx是ISO 639-1中所定义,中文是“zh”,具体可以在维基百科中查。
语言的处理是比较简单的,但是在设备的选择上就比较复杂,因为组合很多。Android对文件夹的命名有规则,例如屏幕方向在是否触摸屏之前,触摸屏在屏幕尺寸之前,例如res/layout-large-port-notouch-qwerty ,res/layout-large-port-stylus-nokeys,res/layout-normal-land-finger-qwerty 等等,这里的port是portrait,和land(landscape)对应。但是如果我们要为每种可能的排列主要进行处理,几乎不太可能,我们看看Android选取文件的一些原则:
一、Android会将不适配的文件作为候选,例如有一个res/layout-large-port,而当前设备是普通尺寸,即不适配与-large,因此这个文件夹将作为候选,如果我们找不到相应的文件,才会在这里选择。记得我们在处理图片资源的时候,我们见过某个PNG的图片放置在res/drawable-hdpi,而没有放置在res/drawable-mdpi,普通尺寸是会先查询-mdpi,如果没有,再查询其他,因此如果你只放置一个图片资源,放置在哪个文件夹都是可以调用的。
二、选择具有最多匹配项,例如有res/layout-large-port-finger-nokeys,和res/layout-port,都匹配,则前者的匹配数目多,则前者优先。
三、如果匹配数目相同,例如res/layout-large-finger-nokeys和res/layout-large-port-nokeys,他们的匹配数目相同,这是按前后的优先级别,因为port是放置在finger的前面,因此-port具有更高的优先级别。
根据这些原则,我们并不需要真的将所有的可能进行组合,只需将相关的给出就可以了。
相关链接: 我的Android开发相关文章