天天看点

Android学习笔记(三九):资源resource(下)

在上一次学习笔记中,学习了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开发相关文章