【Based Android】让你轻松多语言-关于android如何使用最佳的资源

本文介绍了Android系统如何根据设备的不同配置(如屏幕方向、分辨率、语言等)选择合适的资源文件,确保应用程序能在多种环境下正常运行。同时通过一个简单的实例演示了如何实现应用的多语言支持。

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

  这篇文章是断断续续写的,所以思路有些乱,不管怎么样,希望能读懂的人能读懂。

 

 

 

转载于:https://www.cnblogs.com/octobershiner/archive/2012/03/03/2378647.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值