您的位置:首页 > 移动开发 > Android开发

【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

<?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机制有关的,后期,我觉得有必要深入讨论一下这里,因为当我在程序中设置不允许系统自动保存状态的时候,例子中的中英文是无效的。

这篇文章是断断续续写的,所以思路有些乱,不管怎么样,希望能读懂的人能读懂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: