`

Android 资源和国际化

 
阅读更多

资源是您在代码中使用到的并且在编译时被打包进您的应用程序的附加文件。 Android支持多种 不同的文件,包括 XML PNG JPEG文件。 XML文件的格式决定于其描述的内容。这些文件将描述文件支持 的类型、语法或格式。

处于加载效率的考虑,资源被从代码 中分离出来,而且 XML文件被编译进二进制代码中。字符串,类似的会被压缩存储为更经济的格式。处于这样或那样的原因, Android平台中会存在很多不同的资源和资源定义文件。

这些文件包括以下部分:

o    创建资源

o    使用资源

§  在代码中使用资源

§  引用资源

§  引用主体属性

§  使用系统属性

o    更改资源

o    资源引用

o    术语表

  • 国际化( l18N

配合资源引用文档, Android提供了一套经济的资源处理技术。他转化了大量的资源信息,使 Android在运行时无需了解文档的内容,仅仅在您需要的时候指导他在哪儿就可以了。

资源

这一节包含了与资源有关联的术语表和一系列使用资源的代码事例。更完整的 Android资源指南 请参看“资源”一章。

Android资源系统保存所有与代码无关资源的存根。您可以使用 Resources类 访问您应用程序的资源;与应用程序相关联的资源实例可以通过 Context.getResources()得到。

一个应用程序的资源可以被构建系统 在构建时编译进二进制的应用程序里。为了使用资源,您需要正确的初始化您应用程序中的资源树并且构建您的应用程序。在构建过程的部分,每个资源的标识被产 生,您可以在代码中使用他们。这些标识允许编译器校验您应用程序中的代码和资源定义是否匹配。

有关本章的其他细节请参见教程如何 使用资源的部分。

创建资源

Android支持字符串,位图和许多其他类型的资源。每一种资源定义文件的语法和格式及保存的位置取决于其依赖的对象。通常,您可以通过 三种文件创建资源: XML文件(除位图和原生文件外),位图文件(作为图片)和原生文件(所有其他 的类型,比如声音文件)。事实上,这里有两种不同类型的 XML文件,一种是作为资源被编译近应用程 序,另一种怎是资源的描述,被 aapt使用。下面的表格详细说明了这些 XML文件的类型和结构。

您可以在您项目 res/目录下的适当 子目录下创建和存储资源文件。 Android使用资源编译器访问资源所在的子目录和格式化的文件。 下面的表格列出了每一种资源的文件类型。参见“资源引用”一节可以了解关于对象、语法和格式方面的内容。

 

目 录

资源类型

res/anim

XML文件编译为桢序列动画或者自动动画对象。

res/drawable

.png 9.png .jpg文件被编译为 Drawable资源子类型:

使用 Resources.getDrawable(id)可以获得资源类型

res/layout

资源编译为屏幕布局器。参见“ 布局器 ”一章

res/values

XML 文件可以被编译为多种资源

注意 :不像其他 res下的目录,这个 目录可以包含多个资源描述文件。 XML文件元素类型控制着这些资源被 R类放置在何处。

这些文件可以自定义名称。这里有一 些约定俗成的文件。

  • arrays.xml 定义数组。
  • colors.xml 定义 可绘制对象的颜色 字符串的颜色 。使用 Resources.getDrawable() Resources.getColor()都可以获得这些资源。
  • dimens.xml 定义 尺度 。使用 Resources.getDimension()可以获得这些资源
  • strings.xml 定义字符串(使用 Resources.getString()或者更适合的 Resources.getText()方法获得这些资源。 Resources.getText()方法将保 留所有用于描述用户界面样式的描述符,保持复杂文本的原貌。
  • styles.xml 定义样式对象

res/xml

自定义的 XML文件。这些文件 将在运行时编译近应用程序,并且使用 Resources.getXML()方法可以在运行时获取。

res/raw

自定义的原生资源,将被直接拷贝入 设备。这些文件将不被压缩近您的应用程序。使用带有 ID参数的 Resources.getRawResource()方法可以获得这些资源,比如 R.raw.somefilename

资源被最终编译近 APK文件。 Android创建包装类 R,您可以用他找回资源。 R包含一些与资源所在目录同名的子类。

全局资源

  • 很多资源都允许您定义颜色。 Android接受 web风格的颜色定义 -一组十六进制的颜色值,按照以下序列排列: #RGB #ARGB #RRGGBB #AARRGGBB
  • 所有的颜色都支持 ALPHA通道,头两位十六进制数字指定透明度。 0 ALPHA通道中表示全透明,默认值是不透明。

使用资源

      这一节讲述如何使用您所创建的资源,包括:

·         在代码中使用资源 如何在代码中使用资源。

·         如何引用其他资源中的资源 您可以从其他资源中引用资源。您可以重新使用资源内部的通用资源。

·         支持资源更替 您可以在加载时依据语言、显示配置和主机硬件的不同指定不同的资源。

在编译时, Android生成名为 R的类。 R包含您应用程序所用到的所有的类。这个类包含一些与 res下子目录同名 的子类。这些子类包含每一个您在资源文件中定义的资源的标识。这些资源标识可以在您的代码中引用。这里有一段简单的资源文件,包含一些文字,布局器和图片 资源。

注意 R类是自动生成的,并且它不能被手动修改。当资源发生变动时,它会自动修 改。

package com . android . samples ;
public final class R {
   
public static final class string {
       
public static final int greeting = 0x0204000e ;
       
public static final int start_button_text = 0x02040001 ;
       
public static final int submit_button_text = 0x02040008 ;
       
public static final int main_screen_title = 0x0204000a ;
   
};
   
public static final class layout {
       
public static final int start_screen = 0x02070000 ;
       
public static final int new_user_pane = 0x02070001 ;
       
public static final int select_user_list = 0x02070002 ;

   
};
   
public static final class drawable {
       
public static final int company_logo = 0x02020005 ;
       
public static final int smiling_cat = 0x02020006 ;
       
public static final int yellow_fade_background = 0x02020007 ;
       
public static final int stretch_button_1 = 0x02020008 ;

   
};
};

在代码中使用资源

在代码中使用资源需要知道 完整的资源 ID 和您的资源对象类型。下面是资源引用语法:

R.resource_type.resource_name 或者 android.R.resource_type.resource_name

resource_type R 类中保存制定类型资源的子类。 resource_name 是定义在 XML 文件中的资源名或者被其他文件类型所定义的资源文件名(无扩展名) 每一类型的资源都依据其类型,被添加入某一指定的 R 子类;学习 R 子类的类型关系请参考资源引用一节。您的应用程序引用已被编译的资源时可以不带包名 (比如 R.resource_type.resource_name )。 Android 包含一个标准资源的序号,比如屏幕 的样式和按钮的背景。引用这些资源,您必须使用带 android 的语法,比如 android.R.drawable.button_background

下面是一些好的和不好的代码例子:

// Load a background for the current screen from a drawable resource.




this

.

getWindow

().

setBackgroundDrawableResource

(

R

.

drawable

.

my_background_image

);






// WRONG Sending a string resource reference into a 




// method that expects a string.




this

.

getWindow

().

setTitle

(

R

.

string

.

main_title

);






// RIGHT Need to get the title from the Resources wrapper.




this

.

getWindow

().

setTitle

(

Resources

.

getText

(

R

.

string

.

main_title

));






// Load a custom layout for the current screen.



setContentView

(

R

.

layout

.

main_screen

);






// Set a slide in animation for a ViewFlipper object.



mFlipper

.

setInAnimation

(

AnimationUtils

.

loadAnimation

(

this

,

 



        R

.

anim

.

hyperspace_in

));






// Set the text on a TextView object.




TextView

 msgTextView 

=

 

(

TextView

)

findViewByID

(

R

.

id

.

msg

);



msgTextView

.

setText

(

R

.

string

.

hello_message

);

 

引用资源

一个属性值(或资源)同样可以引用 资源。这种用法常在资源布局器文件中用于文字和图片(定义在其他文件中)。这种方法可以引用任何资源,包括颜色和整数。

比如,如果我们有一个颜色资源,我 们可以写一个布局器文件,在其中指定文本颜色和尺寸。

<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
    
xmlns:android="http://schemas.android.com/apk/res/android"
    
android:layout_width="fill_parent" android:layout_height="fill_parent"
    
android:textColor="@color/opaque_red"


    
android:text="Hello, World!" />

注意,“ @ ”前缀声明这是一个资源引用 随后的文本是以 @[package:]type/name 形式提供的资源名。在这个例子中我 们不需要指明特定的包,因为我们在我们自己的包中引用。引用一个系统文件时,我们需要这样写:

<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
    
xmlns:android="http://schemas.android.com/apk/res/android"
    
android:layout_width="fill_parent" android:layout_height="fill_parent"
    
android:textColor="@android:

color/opaque_red"
    
android:text="Hello, World!" />

在其他的例子中您会经常看到使用资 源引用实现本地化。

<?xml version="1.0" encoding="utf-8"?>

<EditText id="text"

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent" android:layout_height="fill_parent"

    android:textColor="@android:color/opaque_red"

    android:text="@string/hello_world" />

这种简便的方法可以在资源之间引 用。比如,我们可以创建一个新的可绘制对象,一个真实存在的图片的别名:

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <drawable id="my_background">@android:drawable/theme2_background</drawable>

</resources>

引用主题属性

其他种类的资源可以引用当前主题的 属性值。这些属性只能是样式资源或 XML 属性。利用这种方法,您可以定制您的 UI 界面,使其与当前主题保持风格上的统 一。

下面的例子展示了如何使用系统主题 设置布局器中的文本颜色:

<?xml version="1.0" encoding="utf-8"?>

<EditText id="text"

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent" android:layout_height="fill_parent"

    android:textColor="?android:textDisabledColor"

    android:text="@string/hello_world" />

注意:引用主题属性的方法和引用资 源的方法很相似,仅仅是用“?”替代了“ @ ”。当您使用这个标记,你所提供的资源名必须能够在主题属性中找到,因为资源工具认为这个资源属性是被期望得到 的,您不需要明确的支出他的类型 ?android:attr/android:textDisabledColor )。

使用系统资源

许多包含于系统之中的资源 是能被应用程序所访问的。所有的资源被定义在 android.R 类中。比如,您可以使用一下代码在屏幕上显示标准应用程序的 ICON

public class MyActivity extends Activity
{
   
public void onStart ()
   
{
        requestScreenFeatures
( FEATURE_BADGE_IMAGE );

       
super . onStart ();

        setBadgeResource
( android . R . drawable . sym_def_app_icon );
   
}
}

类似 的,下面的代码会更改您的系统主题:

public class MyActivity extends Activity
{
   
public void onStart ()
   
{
       
super . onStart ();

        setTheme
( android . R . style . Theme_Black );
   
}
}

为语言和配置提供可更换的资源

您可以为您的应用程序选择 不同的 UI 语言和硬件配置。注意,尽管您可以使用不同的字符串,布局管理器和其他的很多资源, SDK 不会暴 露方法支持您显示的指定何种资源需要被加载。 Android 识别整套资源的硬件和本地化属性,而后适当的加载他们。用户可以在设备的 设置面板中更换语言设置。

为了包 含可更换资源,创建平行的资源目录,以限定的方式命名这些目录,配置文件也同样适用(语言、屏幕等)。下面的例子给出同时支持英语和法语的方法:

MyApp/

    res/

        values-en/

            strings.xml

        values-fr/

            strings.xml

Android 支持多种命名限定和多样的值风格。添加这些信息到资源目录末尾,使用连接 号分离。您可以为单个目录添加多段限定。但是他们需要保持一定顺序以方便阅读和理解。下面的例子就是一个带有限定的可绘制对象资源目录的全名:

MyApp/

    res/

        drawable-en-rUS-port-160dpi-finger-keysexposed-qwerty-dpad-480x320/

更具代 表性的,您可能需要指定一些资源配置参数。您也许需要除去完整列表中的一些值,但是还有很多很多值被保留在列表中:

MyApp/

    res/

        drawable-en-rUS-finger/

        drawable-port/

        drawable-port-160dpi/

        drawable-qwerty/

 

 

限 定词

语言

两字节 ISO 639-1 低位的语言编码,比如: en , fr , es

区域

两字节 ISO 3166-1-alpha-2 带有小写 "r" 前缀的大写地区编码。如: rUS , rFR , rES

屏幕方向

port , land , square

屏幕像素 密度

92dpi , 108dpi , etc.

触摸屏类 型

notouch , stylus , finger

用户是否 可以使用键盘

keysexposed , keyshidden

默认的文 字输入方法

nokeys , qwerty , 12key

默认的非 触摸导航方法

notouch , dpad , trackball , wheel

屏幕尺寸

320x240 , 640x480 , etc. 较大的尺寸必须首先声明。

次列表不包括设备定制的参数,比如 信号、商标等。所有应用程序应该知道的信息都需要按照上面的列表信息编码。

这里有一些命名的通用原则:

·         值之间用连接号连接

·         值是大小写敏感的,比如

o    一个指定的 drawable 目录必须命名为 drawable-port ,而不是 drawable-PORT

·         每种限定词只能有一种选择,您不能命名 目录为 drawable-rEN-rFR/

·         您可以添加多种限定词,但是每个限定词 必须在在上面列表中。比如 drawable-en-rUS-land 表明其用于直板的美式英语设别上。

·        带有限定词的目录不能被嵌套,比如, res/drawable/drawable-en 是不允许的。

·        资源引用在语法中表示为未加修饰的表达式,比如   MyApp/res/drawable-port-92dp/myimage.png ,在 XML 中表示为: @drawable/myimage ,在代码中表示为: R.drawable.myimage

Android 如何找到最匹配的目录

Android 将根据配置文件挑选资源,挑选过程为:

1.           排除所有和配置文件中指定的当前设备参数不匹配的资源。比如,如果屏幕像素密度为 108dpi ,下面所列出的目录中,只有 MyApp/res/drawable-port-92dpi/ 会被排除。

MyApp/res/drawable/myimage.png

MyApp/res/drawable-en/myimage.png

MyApp/res/drawable-port/myimage.png

MyApp/res/drawable-port-92dpi/myimage.png

 

2.               接下来系统将根据限定字的多少来筛 选。例如,如果您的本地系统识别为 en-GB 编码的便携设备,随后我们还剩两个目录可以匹配。

MyApp/res/drawable/myimage.png

MyApp/res/drawable-en/myimage.png

MyApp/res/drawable-port/myimage.png

 

3.               选择机制将根据配置文件中定义的优先 级,优先级定义于上面的列表顺序中。

4.    MyApp/res/drawable-en/myimage.png

5.    MyApp/res/drawable-port/myimage.png

分享到:
评论

相关推荐

    Android中实现文字、图片资源国际化案例

    Android中实现文字、图片资源国际化案例!

    Android的资源与国际化设置

    详细讲述android的资源与国际化配置,如果你还对此不太了解,希望这个文档能让你明白

    Android 资源与应用国际化

    3.Resources and Internationalization(资源和国际化) 4.本地化你的Android 应用程序 5.在Android 中轻松实现横竖屏的布局 6.如何获取当前Locale ,设定Locale 7. 如何在代码中强行指定自己App 的locale 8.Android...

    Android-Android国际化文档整理xml和excel互转

    本项目 用于 Android 中的xml 文件的字符串转为excel 文档,Android国际化文件整理为excel文件,再通过excel文档转为安卓所需要的values文件

    Android App国际化示例

    简述如何在Android项目上,支持多国语言!实现App资源国际化

    Android多语言与国际化

    在Android工程的res目录下,通过定义特殊的文件夹名称就可以实现多语言支持. 一般用 语言_地区的形式表示一种语言,如 zh_CN, zh_TW.

    Android国际化资源文件Excel模板

    用于android资源文件生成工具读取,存放各国语言翻译好的文字

    本示例演示android 资源国际化

    本示例演示国际化, 这里通过两种方式:通过 Locale 对象设置方式和过使用资源目录方式处理

    Android app 开发国际化简单案例

    roid 其实会根据用户当前使用的环境对应几套方案:例如本文所讲的主题,从国际化角度,可能对应中文环境方案,英文环境方案?那么,这时候 R 文件对应的这个资源便不确定起来,当我们通过 R 文件调用一个图片资源...

    android 国际化语言适配

    产看demo里面有实现方式,如果有不明白的可以结合这篇博客进行实现...点击上传资源即表示您确认该资源不违反资源分享的使用条款,并且您拥有该资源的所有版权或者上传资源的授权

    eoeAndroid特刊第五期 Android+widget pdf

    eoeAndroid特刊第五期 Android+widget 资源与应用国际化 pdf,本期特刊将翻译一些文章,并参考一些例子撰写一批实际的例子,讲解国际化的步骤和过程。内容包含但不限于如下方面:  1. 源和资产(Resources and ...

    Android国际化文本资源文件处理

    1,读取项目中的所有strings.xml文件并导出为excel得到excel1。 2,可以将同样结构的excel2中的内容同步到excel1。 3,将所有excel1中的内容以自行配置(StringsToExcel.java)的文件夹(如"values-ko-rKR", "values-ja...

    android国际化

    该资源包含了一个android实现的国际化的简单那应用,可以根据系统设置的语言动态的更改显示的文字和图片,简单易懂,喜欢的下载!

    android String.xml Excel 相互转换工具

    android 国际化 String.xml Excel 相互转换工具

    国际化代码

    如果你开发的程序会在全球或其它国家发布,就需要对程序进行国际化处理,Google的工程师早就想到这一点,我们程序员只需按Google定义好的规则创建对应的目录,系统就会根据当前国家和语言来使用不用的资源文件。

    疯狂Android讲义源码

     6.11 国际化和资源自适应 251  6.11.1 Java国际化的思路 252  6.11.2 Java支持的语言和国家 252  6.11.3 完成程序国际化 253  6.11.4 为Android应用提供国际化  资源 255  6.11.5 国际化Android应用 256  ...

    Android实例代码

    6.11、国际化和资源自适应: 第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图:Canvas; Paint; Path; 7.3、图形特效处理:使用Matrix控制变换; 使用drawBitmapMesh扭曲...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    6.11、国际化和资源自适应: 第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图:Canvas; Paint; Path; 7.3、图形特效处理:使用Matrix控制变换; 使用drawBitmapMesh扭曲...

Global site tag (gtag.js) - Google Analytics