与开发实际的产品不同,平时大家写android应用自己玩的时候,不会在意一个问题,就是针对不同的配置的手机去配置不同的资源。
今天琢磨起了这个问题,也就是说由于android现在的设备和版本号越来越多,android在资源上支持为不同的设备环境提供不同的资源。其实我感觉这个问题会越来越值得android开发者的关注,因为现在系统版本发布较快,今年秋天估计就要发布android 5.0 ,随之又将是sdk的一番更新,加上现在HTC 三星和索尼等厂商不断发布新的分辨率和尺寸的手机,变化就更大了。app的国际化,语言版本的复杂化。。。都决定着这个问题的发生。。
其实事情远没有这么复杂,开发程序还是没有那么困难的,今天只是忽然想到这里,google了一下,也没有什么这样的文章。。。所以就“翻译一下”android究竟怎样选择不同资源文件夹下的资源来访问。
下面是android官网上的一张解释图:
这就是android如何根据本机的实际情况去选择res文件夹下的资源的过程,(res下的资源种类请参考官方文档),有时候可能几个文件夹均满足配置的需求,但最后只会选择一个。
1 首先,系统会将不符合实际情况的限定符排除,比如现在的手机语言环境是中文zn,则类似
- drawable-en-port/
- drawable-en-notouch-12key/
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <TextView
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:text="@string/hello"
11 android:textSize="24sp"
12 android:textStyle="bold"/>
13
14 <EditText
15 android:id="@+id/myText"
16 android:layout_width="fill_parent"
17 android:layout_height="@dimen/basic_button"
18 />
19 </LinearLayout>
在显示文本的时候,我们定义了一个string资源,一些初次编写android程序的朋友,会认为没有必要引用资源,而是直接将所需要的文本写在text这里,比如
android:text="Hello World, MutiVersionActivity!"
但是,当我们需要制作多个语言版本的时候,就会很不方便了,难道要准备写两个view吗?
除了这个问题意外,上面的引用资源的方式也不符合android程序设计的一个重要思想,就是对于资源的引用,iphone也是这样的设计思路。
现在上面讲的android会根据不同的配置环境,选择不同的配置文件。
为了实验方便,假设我们需要在设备竖屏的时候显示英文界面,在设备横屏的时候显示中文界面。
于是我们针对两种不同的配置建立如下资源文件夹
其中values中(针对默认配置的资源文件夹)的strings.xml为
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4 <string name="hello">Hello World, MutiVersionActivity!</string>
5 <string name="app_name">MutiVersion</string>
6
7 </resources>
values-land中(针对横屏情况的资源文件夹)的strings.xml为
1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3
4 <string name="hello">这是一个横屏中文版界面</string>
5 <string name="app_name">多版本测试</string>
6
7 </resources>
这样当我们直接按下面的方式引用字符资源的时候,系统就会自动选择符合需求的资源了。
android:text="@string/hello"
下面是运行截图,可以实时的切换。。。大家可以试一试
当把手机横置的时候,切换到中文界面,测试环境为HTC DESIRE HD android 2.2
当然android可以根据各种不同的配置,动态的变化资源,实际上,在orietation改变的时候,activity经历一次新的声明周期,而且是和
Handling Runtime Changes机制有关的,后期,我觉得有必要深入讨论一下这里,因为当我在程序中设置不允许系统自动保存状态的时候,例子中的中英文是无效的。
这篇文章是断断续续写的,所以思路有些乱,不管怎么样,希望能读懂的人能读懂。