`
ouyangfeng521
  • 浏览: 248683 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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应用开发中,为了使应用能够适应全球不同的语言环境,开发者通常会采用资源国际化(i18n,Internationalization)技术。这个过程涉及到将应用中的文本和图片资源分离出来,以便根据不同地区创建对应的翻译...

    Android的资源与国际化设置

    ### Android的资源与国际化设置 #### 一、资源管理 **资源**是Android应用程序中所有非代码文件的...通过上述内容的学习,开发者可以更好地理解和掌握Android资源系统的使用方法,从而开发出更加高质量的应用程序。

    Android 一键国际化

    "Android 一键国际化"是一个针对Android Studio的高效插件,旨在帮助开发者便捷地为应用添加多语言支持,尤其对于那些需要快速扩展到不同国家和地区的企业或个人开发者来说,这是一款非常实用的工具。 该插件的主要...

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

    "Android-Android国际化文档整理xml和excel互转"项目主要关注如何方便地管理和转换Android应用中的本地化资源。 一、Android的国际化原理 Android的国际化是通过资源文件夹来实现的。在项目的`res`目录下,我们...

    android国际化中英文切换demo

    总的来说,Android的国际化是一个涉及资源文件、配置和编程逻辑的过程。通过合理的资源管理和编程,我们可以轻松地实现应用的中英文切换,为用户提供更个性化的服务。这个demo提供了一个实用的起点,有助于开发者...

    android语言设置国际化

    在Android中,国际化主要涉及资源文件的组织和处理,以便系统可以根据用户的地区设置动态地加载相应的资源。 资源文件在Android中存储于res目录下,按照语言和地区的ISO 639-1和ISO 3166-1 alpha-2标准进行分类,如...

    android国际化

    在博文链接中(虽然这里未提供具体内容),通常会分享更多关于Android国际化实践的经验、技巧和案例,例如如何优化资源文件结构,提高本地化效率,或者如何利用自动化工具进行批量处理等。 总之,Android国际化是...

    Android 国际化Demo

    总的来说,这个“Android国际化Demo”项目是一个实践性的教学案例,它涵盖了Android应用国际化的基本要素,包括文本和图片资源的管理,以及用户语言选择的存储和恢复。通过学习和实践这个示例,开发者可以更深入地...

    Android字符串国际化

    在Android开发中,为了使应用能够适应不同语言和地区的用户,字符串国际化的概念至关重要。它允许开发者将应用的文本资源分离出来,以便于根据不同国家和地区的需求进行翻译和定制。下面我们将详细探讨Android字符串...

    Android App国际化示例

    在当今全球化的市场环境下,软件产品的国际化已经成为了开发者...随着Android系统的不断更新和优化,国际化支持的功能也在不断增强,开发者应当利用这些工具和方法,使得自己的应用能够更好地服务来自世界各地的用户。

    android国际化工具

    "android国际化工具"是开发者用来自动化处理字符串翻译过程的利器,它极大地简化了Strings.xml和arrays.xml等资源文件的多语言支持工作,从而提升了开发效率。 Android的国际化(i18n,即“internationalization”...

    本示例演示android 资源国际化

    在Android开发中,资源国际化(i18n)是一个重要的环节,它允许应用程序根据用户的语言和地区设置提供相应的本地化内容。本示例旨在详细介绍如何在Android应用中实现资源的国际化,以便为全球用户提供更好的用户体验...

    Android 资源与应用国际化

    ### Android资源与应用国际化...总结来说,Android应用的国际化和本地化是一个多方面的工作,涉及到资源管理、布局调整、语言和文化适应等多个环节。通过合理规划和使用适当的工具,可以有效提升应用的质量和用户体验。

    Android多语言切换(国际化)

    本教程将详细介绍如何在Android项目中实现多语言切换,让您的应用具备国际化能力。 首先,我们需要了解Android的资源管理机制。Android系统通过res目录下的values文件夹来存储不同类型的资源,如字符串、颜色、布局...

    Android 国际化 一键切换语言

    综上所述,实现"Android 国际化 一键切换语言"功能需要对Android资源管理、配置设置以及用户首选项有深入的理解。通过合理的代码设计和测试,开发者可以为用户提供一个流畅的多语言切换体验,提升应用的全球适用性。

    Android 国际化简单Demo

    在Android应用开发中,国际化的实现是至关重要的,它使得应用程序能够适应不同语言和文化背景的用户。"Android 国际化简单Demo"是一个基础的示例,展示了如何在Android应用中实现中英文切换功能。这个Demo的核心在于...

    Android样式主题_国际化_动画

    在Android开发中,样式的定义和应用是实现界面美观和一致性的关键技术之一...综上所述,通过合理利用样式、主题、国际化和动画,开发者能够创建出既美观又能够适应不同地区用户习惯的应用程序,从而大大提升用户体验。

    完整的android 国际化处理包

    1. **ICU库**: "icu"标签很可能指的是国际部件联盟(International Components for Unicode, ICU),这是一个广泛使用的开源库,提供了丰富的Unicode支持以及跨平台的国际化和本地化功能。ICU在Android中用于处理...

    Android应用源码之(本地化与国际化).zip

    在Android应用开发中,本地化和国际化是两个关键的概念,它们允许开发者构建能够适应不同语言和地区设置的应用。本文将深入探讨这两个概念,并结合提供的源码进行解析和学习。 首先,让我们理解什么是本地化...

Global site tag (gtag.js) - Google Analytics