Android应用程序开发——支持不同设备

来源:互联网 发布:java异常和错误的区别 编辑:程序博客网 时间:2024/05/22 06:44

支持不同设备

 

Android设备被制造成各种形状以及各种尺寸。通过这些各种各样的设备,你的应用程序将会获得更多的受众。作为一个成功Android应用程序,需要适应不同的设备配置。你应该考虑的一些重要变量包括了不同的语种,屏幕尺寸以及Android平台的版本。

 

如何使用可替代的资源这个平台基本特征以及其他平台特征应用在一个应用程序中,这样可以让你的应用程序在多种Android设备中提供优化过的用户体验。

 

支持不同语言

字符串独立于应用程序UI独立实现是一个很好的习惯。每个Android项目中都有一个资源目录。

 

如果你使用Android SDK工具(参阅Creating an Android Project)创建了项目,则工具会在项目的顶层创建一个res/目录。在这个res/目录中有用于多个资源类型的子目录。也还有一些默认文件,如res/values/strings.xml,它保存了字符串配置。

 

 

创建区域设置目录和字符串文件

要添加更多的语言支持,要在res/里面创建额外的values目录,这个res/在目录名称的最后包括了一个连字符(”-”)和ISO国家代码(例如”es“)。例如,values-es/就是包含带有语言代码为”es”的区域设置的简单字符资源配置。当应用程序运行的时候会根据设备当前设置的语种加载合适的资源。

 

一旦已经决定将要支持的语言,则创建资源子目录和字符串资源文件。例如:

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">Mon Application</string>    <string name="hello_world">Bonjour le monde !</string></resources>

注意:你可以在任何一种资源都可以使用区域设置限定符(或者任何一个配置限定符),比如,你可以提供位图drawable的本地化版本。

 

使用字符串资源

通过使用由<string>元素的name属性所定义的资源名称,你就可以在源代码或者其它XML文件中引用字符串资源。

 

在源代码中,可以用句法规则R.string.<string_name>应用的字符串资源。以这种方式使用字符串资源。

 

例如:

// Get a string resource from your app's ResourcesString hello = getResources().getString(R.string.hello_world);// Or supply a string resource to a method that requires a stringTextView textView = new TextView(this);textView.setText(R.string.hello_world);

在其它XML文件中,无论何时XML属性引用字符串资源,语法为规则@string/<string_name>来引用字符串资源。

 

例如:

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

 

 

支持不同屏幕

Android使用两个通用属性,尺寸和密度,将设备屏幕分类。你的应用程序被安装到尺寸和密度都不同的屏幕的设备上的时候应包括一些可替代资源,使用这些资源来优化在不同的屏幕尺寸和密度的设备上运行时的应用程序的外观。

 

l  四种通用尺寸:小(small),正常(normal),大(large),加大(xlarge)。

l  四种通用密度:低(Idpi),中等(mdpi),高(hdpi),超高(xhdpi)密度

 

为声明用于不同屏幕的不同布局和位图,必须把可替代的资源置于单独的目录中,类似于声明不同语种的字符串资源的方法。

 

还要注意屏幕方向(横向或纵向)同样被认为是屏幕尺寸的变量,因此很多应用程序应该修订布局,以便在每个方向都优化用户体验。

 

创建不同的布局

为了在不同的屏幕尺寸上优化用户体验,应要为想要支持的每个屏幕尺寸创建一个唯一的布局XML。每个布局都应该被保存在适当的资源目录中,以-<screen_size>后缀命名。例如,用于大屏幕的唯一布局应该被保存在res/layout-large/下面。

 

注意:Android自动调整布局来恰当地适应屏幕。这样,用于不同屏幕尺寸的布局就不需要担心UI元素的绝对尺寸了,而是聚焦于影响用户体验的布局结构。

 

例如,该项目包括一个默认布局和用于大屏幕的一个可替代布局:

MyProject/

    res/

        layout/

            main.xml

        layout-large/

            main.xml

文件名称必须完全一样,但是它们的内容是不同的,目的在于为相应的屏幕尺寸提供一个优化过的UI。

 

仅仅在应用程序中引用布局文件即可:

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

基于应用程序正在运行的所在设备的屏幕尺寸,系统从适当的布局目录中加载布局文件。

 

再来一个例子,这里有一个有着横向的可替代布局项目:

MyProject/

    res/

        layout/

            main.xml

        layout-land/

            main.xml

默认情况下,layout/main.xml文件是用于纵向的。

 

如果想要为横向提供一个特殊的布局,包括在大屏幕上时,那么就需要一起使用large和land限定符:

MyProject/

    res/

        layout/              # default (portrait)

            main.xml

        layout-land/         # landscape

            main.xml

        layout-large/        # large (portrait)

            main.xml

        layout-large-land/   # large landscape

            main.xml

注意:Android 3.2及以上版本支持一个定义屏幕尺寸的高级方法,就密度无关的像素而言,在最小宽度或者高度的基础上,该方法允许你为屏幕尺寸指定资源。

 

创建不同的位图

为应用程序提供不同密度(低,中,高和超高密度)的图片资源是一个很好的习惯。这将会帮助你的应用程序在不同密度的屏幕上达到比较理想的视觉效果。

 

若要生成这些图片,应从矢量格式中的原始资源开始,并使用以下尺寸来为每个密度生成图片:

·        xhdpi: 2.0

·        hdpi: 1.5

·        mdpi: 1.0(基线)

·        ldpi: 0.75

这指的是分别为xhdpi设备生成200 x 200的图片,为hdpi设备生成150 x 150的,为mdpi设备生成100 x 100的,为Idpi设备生成75x 75的。

 

然后,将文件置于合适的drawable资源目录中:

MyProject/

    res/

        drawable-xhdpi/

            awesomeimage.png

        drawable-hdpi/

            awesomeimage.png

        drawable-mdpi/

            awesomeimage.png

        drawable-ldpi/

            awesomeimage.png

 

任何时候引用@drawable/awesomeimage时,系统会选择基于屏幕密度上的合适的位图。

 

注意:低密度(Idpi)资源不总是必需的。当提供hdpi资源时,系统缩小一半的屏幕密度来恰好适应Idpi屏幕。

 

 

支持不同的平台版本

Android最新版本通常为应用程序提供很好的API的同时,你应当在更多设备获得更新之前还继续支持Android的老版本。本教程告诉你在继续支持老版本的同时,如何利用最新的APIs

 

在访问Google Play Store的设备号码的基础上,PlatformVersions的仪表盘会定期更新,以便显示运行在每个Android版本上的活跃设备的分布。通常,在将应用程序放到最新版本上的同时,它能支持90%的活跃设备,这就很好。

 

提示:为在几个Android版本上提供最好的特征和功能,你应该在应用程序中使用Android SupportLibrary,这就允许你在老版本上使用几个目前的平台APIs

 

指定最低的和目标API Level

AndroidManifest.xml文件描述了有关应用程序并且识别了它所支持的Android版本。具体说来,用于<uses-sdk>元素的minSdkVersiontargetSdkVersion属性识别与应用程序兼容的最低API层级,还识别对已经设计和测试过的应用程序的最高API层级。

 

例如:

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

随着Android新版本发布,一些风格和行为都有可能改变。为允许应用程序利用这些改变并确保应用程序适合每个用户设备的风格,应当设置targetSdkVersion值来匹配可用的Android最新版本。

 

在运行时检查系统版本

AndroidBuild常量类中为每个平台版本提供一个唯一的代码。在应用程序里面使用这些代码来建立环境,这些环境确保了依赖于更高API层级上的代码仅在那些API在系统上可用时才执行。

private void setUpActionBar() {    // Make sure we're running on Honeycomb or higher to use ActionBar APIs    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {        ActionBar actionBar = getActionBar();        actionBar.setDisplayHomeAsUpEnabled(true);    }}

注意:在配对XML资源时,Android忽略当前设备不支持的XML属性。这样,你就不用担心老版本在遇到这个唯一代码时不会崩溃,而能放心使用XML属性。例如,如果设置targetSdkVersion="11",则在Android 3.0及更高版本的默认情况下,应用程序包括了ActionBar。然后,要将菜单项目添加到操作栏上,这就需要在菜单资源XML中设置android:showAsAction="ifRoom"。在一个跨版本XML文件上这么做是安全的,因为Android老版本只忽略showAsAction属性(即,在res/menu-v11/中不需要一个单独的版本)。

 

使用平台风格和主题

Android提供了赋予应用程序和底层操作系统的感观的用户体验主题。这些主题可以被应用到manifest文件里的应用程序中。通过使用这些内置风格和主题,应用程序自然继承随每一次新发布而来的最新感观。

 

使得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">

要将一个主题应用到整个应用程序(所有的activity)中,将android:theme属性添加到<application>元素中:

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


关于创建和使用主题的更多信息,参阅Styles and Theme指南。


0 0
原创粉丝点击