【Based Android】让你轻松多语言-关于android如何使用最佳的资源
2012-03-03 20:38
459 查看
与开发实际的产品不同,平时大家写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/
这样的文件夹资源都会被排除
2 其次系统会参照一个包含所有配置的表格,权重由上到下一次递减,比如Screen Orientation就在Screen pixel density (dpi)前面,所以优先参考第一个Screen Orientation参数。这个时候,它会检查所有的文件夹,假设现在的配置是land-scape横屏,它就查找是否有包含-land的文件夹,如果有的话则排除所有其他不包含land的文件夹;如果没有的话,则开始以下一优先级的配置进行比对,依次类推,直到只剩下一个文件夹为止。
那么如果没有文件家满则呢?。。。。很显然就crash掉了
所以官方给出了建议,一定要保证有一个默认的文件夹来处理一般情况,比如就是drawable。这样可以增加程序的健壮性。
基本上就是这些,只是一个小问题的总结,相信项目经验丰富的大神们早就很熟悉了。
下面附上一个例子,让你的应用支持多语言~~~
我们就是简单的写一个提示输入的view
下面是main.xml
在显示文本的时候,我们定义了一个string资源,一些初次编写android程序的朋友,会认为没有必要引用资源,而是直接将所需要的文本写在text这里,比如
其中values中(针对默认配置的资源文件夹)的strings.xml为
values-land中(针对横屏情况的资源文件夹)的strings.xml为
这样当我们直接按下面的方式引用字符资源的时候,系统就会自动选择符合需求的资源了。
当把手机横置的时候,切换到中文界面,测试环境为HTC DESIRE HD android 2.2
当然android可以根据各种不同的配置,动态的变化资源,实际上,在orietation改变的时候,activity经历一次新的声明周期,而且是和
Handling Runtime Changes机制有关的,后期,我觉得有必要深入讨论一下这里,因为当我在程序中设置不允许系统自动保存状态的时候,例子中的中英文是无效的。
这篇文章是断断续续写的,所以思路有些乱,不管怎么样,希望能读懂的人能读懂。
今天琢磨起了这个问题,也就是说由于android现在的设备和版本号越来越多,android在资源上支持为不同的设备环境提供不同的资源。其实我感觉这个问题会越来越值得android开发者的关注,因为现在系统版本发布较快,今年秋天估计就要发布android 5.0 ,随之又将是sdk的一番更新,加上现在HTC 三星和索尼等厂商不断发布新的分辨率和尺寸的手机,变化就更大了。app的国际化,语言版本的复杂化。。。都决定着这个问题的发生。。
其实事情远没有这么复杂,开发程序还是没有那么困难的,今天只是忽然想到这里,google了一下,也没有什么这样的文章。。。所以就“翻译一下”android究竟怎样选择不同资源文件夹下的资源来访问。
下面是android官网上的一张解释图:
这就是android如何根据本机的实际情况去选择res文件夹下的资源的过程,(res下的资源种类请参考官方文档),有时候可能几个文件夹均满足配置的需求,但最后只会选择一个。
1 首先,系统会将不符合实际情况的限定符排除,比如现在的手机语言环境是中文zn,则类似
drawable-en-port/
drawable-en-notouch-12key/
这样的文件夹资源都会被排除
2 其次系统会参照一个包含所有配置的表格,权重由上到下一次递减,比如Screen Orientation就在Screen pixel density (dpi)前面,所以优先参考第一个Screen Orientation参数。这个时候,它会检查所有的文件夹,假设现在的配置是land-scape横屏,它就查找是否有包含-land的文件夹,如果有的话则排除所有其他不包含land的文件夹;如果没有的话,则开始以下一优先级的配置进行比对,依次类推,直到只剩下一个文件夹为止。
那么如果没有文件家满则呢?。。。。很显然就crash掉了
所以官方给出了建议,一定要保证有一个默认的文件夹来处理一般情况,比如就是drawable。这样可以增加程序的健壮性。
基本上就是这些,只是一个小问题的总结,相信项目经验丰富的大神们早就很熟悉了。
下面附上一个例子,让你的应用支持多语言~~~
我们就是简单的写一个提示输入的view
下面是main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textSize="24sp" android:textStyle="bold"/> <EditText android:id="@+id/myText" android:layout_width="fill_parent" android:layout_height="@dimen/basic_button" /> </LinearLayout>
在显示文本的时候,我们定义了一个string资源,一些初次编写android程序的朋友,会认为没有必要引用资源,而是直接将所需要的文本写在text这里,比如
android:text="Hello World, MutiVersionActivity!"
但是,当我们需要制作多个语言版本的时候,就会很不方便了,难道要准备写两个view吗?
除了这个问题意外,上面的引用资源的方式也不符合android程序设计的一个重要思想,就是对于资源的引用,iphone也是这样的设计思路。
现在上面讲的android会根据不同的配置环境,选择不同的配置文件。
为了实验方便,假设我们需要在设备竖屏的时候显示英文界面,在设备横屏的时候显示中文界面。
于是我们针对两种不同的配置建立如下资源文件夹
其中values中(针对默认配置的资源文件夹)的strings.xml为
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, MutiVersionActivity!</string> <string name="app_name">MutiVersion</string> </resources>
values-land中(针对横屏情况的资源文件夹)的strings.xml为
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">这是一个横屏中文版界面</string> <string name="app_name">多版本测试</string> </resources>
这样当我们直接按下面的方式引用字符资源的时候,系统就会自动选择符合需求的资源了。
android:text="@string/hello"
下面是运行截图,可以实时的切换。。。大家可以试一试
当把手机横置的时候,切换到中文界面,测试环境为HTC DESIRE HD android 2.2
当然android可以根据各种不同的配置,动态的变化资源,实际上,在orietation改变的时候,activity经历一次新的声明周期,而且是和
Handling Runtime Changes机制有关的,后期,我觉得有必要深入讨论一下这里,因为当我在程序中设置不允许系统自动保存状态的时候,例子中的中英文是无效的。
这篇文章是断断续续写的,所以思路有些乱,不管怎么样,希望能读懂的人能读懂。
相关文章推荐
- Android 如何使用网络图片资源
- 关于java/android中 Jar中使用图片资源
- 【总结】关于在Android中如何使用字符串数组String[]
- 关于Android开发中如何使用dp表示长宽
- Android 关于 如何使用外界导入的数据库文件
- 如何使用android系统自带资源
- 如何在Android中使用汇编语言
- Android XML布局中关于资源的使用
- 关于如何在Android源码目录中建立自己的C工程,并用mm命令单独进行该C工程模块的编译,以及Android.mk的使用介绍(1)
- 如何使用Android自带的资源
- 轻松实现Android 更换皮肤(主题) - 资源打包为apk,使用AssetManager动态解析调用
- 关于struts Validator在多模块下多国语言资源访问的问题解决之道(一)struts Validator下使用多模块的多国语言资源
- Android中关于远程Service的使用,也就是夸应用的Service是如何使用的
- 关于Android JNI 编程如何定位段错误的问题(addr2line的使用)
- Android 开发 API指南 如何查找最佳匹配资源
- 关于安卓如何使用android-async-http开源框架
- 关于如何在Android源码目录中建立自己的C工程,并用mm命令单独进行该C工程模块的编译,以及Android.mk的使用介绍(2)
- 关于使用android Eclipse按ctrl+鼠标左键或者F5出现source not found的问题如何解决
- 如何在Android中使用汇编语言
- android 如何获取当前系统所使用的语言