第二部分:开发简要指南-第五章 支持不同的Android设备

第5章 支持不同的Android设备

来自世界各地的Android设备在外表上看有许多形状和大小。如此广泛的设备类型,如果你能兼容不同的设备,那么你将为你的App获得一批巨大的潜在用户。为了让你的App在Android设备上尽可能的成功,你需要适应各种设备的配置。这些不同设备中的重要变化就是不同的语言,屏幕大小,和系统版本。关于Android上App的适配,在第一大篇中我们曾讲过基础的理论,并且在“指南-第3章 Hello,本地化”中我们实践过不同语言的支持。在以后的学习过程中,笔者会在适当的时候继续慢慢深入Android的适配,请记住如果你要学精它,不是1,2篇文章就能搞定的。需要你的实践与思考,所以我会循序渐进,不会一股脑的塞给读者。本章内容是简单而快速的实践篇,让你实践我们第一大篇学过的知识。接下来看一下本章内容预览:

1. 支持不同的语言

2. 支持不同的屏幕

3. 支持不同的系统版本

5.1 支持不同的语言

在你的应用程序中把UI字符串提取出来,放入一个外部的单独文件中,这是一个很好的做法,在Android中我们很容易能做到这些。当我们使用Eclipse创建Android项目时,工具会自动生成 res/values/strings.xml这个文件。它就是本小节的主角。

5.1.1创建本地目录和字符串文件

在“Hello,本地化”那章中我们不仅仅是处理的语言还处理的地区,当然本节我们只处理语言,处理地区是跟“drawable”相关的,现在让我们遵循IOS639-1的标准创建values的后缀文件夹,例如values-es,表示使用语言代码为es(西班牙)的本地语言环境,在运行时Android会根据你设备的本地设置来载入合适的资源。如果你的应用想支持几种语言就可以新建对应的文件夹。例如如果我们需要支持西班牙语,法语,英语(默认)则应该如下所示:

MyProject/

    res/

       values/

           strings.xml

       values-es/

           strings.xml

       values-fr/

           strings.xml

这表示,当你的设备中语言的设置为法语或西班牙语的时候都会相应的显示它们的语言,如果你的设备使用汉语的话,这里没有支持,那么就会使用默认的英语,这三个文件中的代码如下所示:

英语 (默认的语言环境),/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>

 

西班牙语, /values-es/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>

 

法语, /values-fr/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Ma Application</string>
    <string name="hello_world">Bonjour tout le Monde!</string>
</resources>

 

5.1.2使用字符串资源

读者可以根据自己定义的<string>元素的name属性,在你的源代码中引用你的字符串资源。在源代码中的使用语言为R.string.string_name。有几种方法可以获取到string.xml中的字符串。如代码清单5-1所示

//在Activity下使用如下代码可以获取字符串资源
String hello = getResources().getString(R.string.hello_world);
//我们的TextView需要使用这个字符串资源来显示文字,所以我们也可以直接使用R.string.hello_world 
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

 

代码清单5-1

如果我们的TextView不是代码生成的布局,而是已经放入布局中的xml中的话,我们可以像代码清单5-2那样使用

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />   

 

代码清单5-2

5.2 支持不同的屏幕

Android设备在区分屏幕时使用两个参数:大小(size)和密度(density),你应该想到你的App将被安装到不同大小和密度的屏幕设备中,所以我们应该包括一些替代资源来为不同的屏幕优化程序的外观。下面回顾我们屏幕的大小和密度有哪几种。

大小:mall, normal, large, xlarge

密度:low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)

关于以上这些名称的数据范围,以前讲过了,这里就不科普了。你想要为不同屏幕使用相应的布局和位图,就需要在不同的目录中放入相应的资源,类似不同语言的字符串。另外要注意屏幕方向(横竖屏切换)也是屏幕大小变化需要考虑的因素,所以很多应用需要在横竖屏的切换中调整布局或使用新的布局来优化用户体验。

5.2.1创建不同的布局

为了在不同的屏幕大小中优化你的用户体验,你可以为每一个你想要支持的屏幕大小创建一个唯一的布局xml文件。每一个布局保存在合适的资源目录,用”-<屏幕大小>”命名。例如,一个专门为large屏幕设计的布局应该保存在res/layout-large/下。为了正确的适应屏幕,Android会自动缩放你的布局。因此,我们不需要担心其他不同屏幕大小下的布局元素的绝对尺寸,而是集中在影响用户体验的布局结构上。例如,以下工程包含一个默认的layout和一个可选择性的large屏幕布局。

MyProject/

    res/

        layout/

            main.xml

        layout-large/

            main.xml

它们里面的文件名必须是是一样的,但文件中的内容可以不一样。我们代码中使用的方法完全没有改变,就像下面的代码清单5-3一样:

@Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
}

 

代码清单5-3

系统从适当的布局目录中载入布局文件,它基于正在运行中设备的屏幕大小。下面在让我们看一下指定支持横向布局的例子:

MyProject/

    res/

        layout/

            main.xml

        layout-land/

            main.xml

默认的layout是用于竖屏的,所以这里我们等于分别支持了横竖屏的布局。如果你想要同时支持多种情况的屏幕的话,你可以参考以下内容:

MyProject/

    res/

        layout/              # 默认 竖屏(portrait)

            main.xml

        layout-land/         # 横屏(landscape)

            main.xml

        layout-large/        # large (portrait)

            main.xml

        layout-large-land/   # large (landscape)

            main.xml

注意:Android3.2和以上版本支持更高级的屏幕大小,允许指定基于最小宽度和最小高度的dip来指定资源。第一大篇我们简单的介绍过,后面我们还会详解,本章属于新手指南为了简单,暂不包含这项新技术。

5.2.2创建不同的位图

你应该总是提供可供正确缩放位图资源,记住!是为每一个密度:low,medium,high,extra-high。这可以帮你在所有屏幕密度下完成很好的图形质量和性能。你可以再开始为每一个密度使用矢量图来作为原始资源。或者能使用矢量图的话就直接使用它,Android中能使用矢量图的地方请千万不要使用位图。下面让我们温习一下密度换算,以前笔者在第一篇已经强调过了:

xhdpi: 2.0

hdpi: 1.5

mdpi: 1.0 (基线)

ldpi: 0.75

如果在xhdpi下是200x200px的图像,其他密度下的大小为:150x150 (hdpi), 100x100 (mdpi),75x75 (ldpi)。这里请稍微花点时间思考下怎么来的。下面我们看下目录结构:

MyProject/

    res/

        drawable-xhdpi/

            lam.png

        drawable-hdpi/

            lam.png

        drawable-mdpi/

            lam.png

        drawable-ldpi/

            lam.png

使用方法:在xml中 @drawable/lam代码中R.drawable.lam。虽然理论上说我们需要支持所有密度,但实际情况下ldpi和xhdpi我们可以不需要考虑,原因是由于hdpi和ldpi是整数倍关系。xhdpi和mdpi也是整数倍关系,所以我们只支持mdpi和hdpi即可

5.3 支持不同的系统版本

虽然Android系统更新的很快,可能我们想使用新版的API,但我们应该继续支持旧版的Android,这样我们的应用才能在更多的设备上使用,本小节会告诉你在低版本的系统中如何使用新版的API。为了提供最好的功能和跨多个Android版本的函数,应该在我们的应用程序中使用Android Support Library(下一张讲述它的用途),它允许您使用旧版本最近几个平台API。

5.3.1指定最低的和目标API Level

AndroidManifest.xml文件描述了关于支持系统版本的细节。特别是mainSdkVersion和targetSdkVersion这两个属性,在uses-sdk节点中标识最低API level和最高API level。例如下面的代码清单5-4:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
    ...
</manifest>

 

代码清单5-4

targetSdkVersion属性可能用的人不多,由于android新版本的发布,一些风格和行为可能会改变,为了让您的应用程序利用这些变化,并确保您的应用程序适合每个用户的设备的风格,你应该设置thetargetSdkVersion值,以配合最新的Android版本。

5.3.2在运行时检查系统版本

Android为每个系统版本提供一个唯一的代码,这些代码作为常量在Build类中。在App中可以使用这些常量来判断运行中的系统版本是否符合你的要求,例如如代码清单5-5所示,它们的用途

private void setUpActionBar() {
    // 确保程序执行的在Honeycomb(Android 3.0)版本或更好的系统版本中,才能使用ActionBar  APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

 

代码清单5-5

当解析XML资源时,Android会忽略当前设备不支持的属性。所以你可以放心的使用新版本的XML属性而无须担心旧版本的问题。例如,如果你设置targetSdkVersion="11",你的App默认可以使用ActionBar,然后你为了添加菜单item到action bar中可能需要在你菜单资源XML中设置 android:showAsAction="ifRoom"。在跨版本的XML文件,它是安全的,因为旧版本的Android根本忽略showAsAction属性(也就是说,你并不需要为v11的菜单单独建立res/menu-v11/)。

5.3.3使用平台的风格和主题

Android提供主题的概念,它在操作系统下的外观和感觉。这些主题可以用manifest文件应用到你的App。通过使用这些内置的风格和主题,你的应用程序会在不同的系统中,使用统一的外观样式。

使你的activity看起来像一个对话框:

<activity android:theme="@android:style/Theme.Dialog">

使你的activity 有一个透明/半透明的背景:

<activity android:theme="@android:style/Theme.Translucent">

为了应用你自己自定义的主题,需要在/res/values/styles.xml定义主题然后使用:

<activity android:theme="@style/CustomTheme">

为了应用一个主题要到你整个应用程序(所有activities),在<application>节点添加 android:theme :

<application android:theme="@style/CustomTheme">

风格和主题更详细的使用方法我们会在后面的框架学习中讲解。

本文来自jy02432443,QQ78117253。转载请保留出处,并保留追究法律责任的权利

posted @ 2012-07-06 10:13  jy02432443  阅读(3010)  评论(2编辑  收藏  举报