Android开发(二、多设备支持)

来源:互联网 发布:爱奇艺网络电视机顶盒 编辑:程序博客网 时间:2024/06/06 02:24

Copy&&翻译自:谷歌中国开发者网站,请点击链接查看原文,尊重楼主版权。现在可以边学习安卓边练练英语了,有些地方直接请教有道字典了,但是有些地方翻译不准或语序不对还是要靠自己的28级英格雷许- -。


不同设备支持


前言:世界之大,有各种形状和大小的安卓设备。因为设备类型之多,你有机会让你的应用让大量用户接触。在安卓上,为了让你的应用尽可能获得成功,你需要让你的应用适配不同的设备配置。这里讲几个你应该考虑的重要的差异化,包括不同语言、屏幕大小、安卓平台版本


这节课教你 利用平台的可选择资源和其他基础平台特征,为了让你的应用能够只使用一个APK包就能在兼容大量设备并提供一个最佳化的用户体验。


一、支持不同语言

在任何情况下,从您的应用代码中提取 UI 字符串并将其存放在外部文件中都是个好办法。Android 在每个 Android 项目中都提供一个资源目录,从而简化了这一过程。

如果您是使用 Android SDK 工具创建的项目,工具会在项目的顶层创建一个 res/ 目录。此 res/ 目录中包含用于存放各类资源的子目录。此外,还包含几个默认文件(如res/values/strings.xml),用于存放您的字符串值。

1.创建语言区域目录和字符串文件

如需添加对更多语言的支持,请在res文件夹内创建额外的 values 目录,并在目录名称末尾加上连字符和 ISO 语言代码。例如,values-es/ 目录包含的简单资源用于语言代码为“es”的语言区域。Android 根据运行时设备的语言区域设置加载相应的资源。如需了解详细信息,请参阅提供备用资源 。


一旦您决定了为哪些语言提供支持,便可创建资源子目录和字符串资源文件。例如:
MyProject/    res/       values/           strings.xml       values-es/           strings.xml       values-fr/           strings.xml
将各个语言区域的字符串值添加到相应文件中。

在运行时,Android 系统会根据当前为用户设备设置的语言区域使用相应的字符串资源集。

例如,以下是一些面向不同语言的不同字符串资源文件。

英语(默认语言区域),/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>


注:您可以在任何资源类型上使用语言区域限定符(或任何配置限定符),例如,您可以提供本地化版本的可绘制位图。 如需了解详细信息,请参阅本地化。


2.使用字符串资源

您可以使用由 <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" />


二、支持不同屏幕

安卓使用两种通用属性区分设备屏幕:大小和密度。你应该会希望你的应用安装在屏幕的大小和密度都在范围类的设备上。同样的,你的应用应该包括一些可选择的资源来优化你的应用在不同大小和密度的屏幕上的显示。

有四种普遍的大小:小,正常,大,超大(xlarge猜的,没搜到)

有四种普遍的密度:低(lapi),中等(mdpi),高(hdpi),极高(xhdpi)

为了能够区别你想给不同屏幕使用的不同的布局和位图,你必须把这些不同的可选择资源放在不同的文件夹,就跟前面给多语言使用的一样。
还有一个需要注意的是屏幕横向和纵向,两者屏幕大小是不一样的,因此许多应用应该修正每种布局来优化用户体验。



1.创建不同布局

为了优化在不同大小屏幕上的用户体验,你应该在每种你想支持的大小的屏幕上创建一个单独的布局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);}

该系统根据应用程序运行的设备的屏幕大小,从适当的布局目录中加载布局文件。有关Android如何选择适当资源的更多信息在提供参考资料指南中可用。

另一个例子,这里有一个项目,有一个可供选择的横向布局:

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和以上支持一种先进的定义屏幕大小的方法,允许您根据密度无关像素的最小宽度和高度来指定屏幕大小的资源。这一课没有涵盖这项新技术。要了解更多信息,请阅读多个屏幕的设计。


2.创建不同的位图

您应该始终提供位图资源,这些位图资源适当地扩展到每一个通用的密度范围中:低、中、高和超高的密度。这有助于您在所有屏幕密度上实现良好的图形质量和性能。
要生成这些图像,您应该从原始资源以矢量格式开始,并使用下面的大小来生成每个密度的图像。

xhdpi: 2.0    hdpi: 1.5    mdpi: 1.0 (baseline)    ldpi: 0.75

这意味着,如果为xhdpi设备生成一个200x200图片,那么应该在150 x150中为hdpi生成相同的资源,为mdpi提供100x100,并为ldpi设备生成75x75。
然后,将文件放置在适当的可提取资源目录中:

MyProject/    res/        drawable-xhdpi/            awesomeimage.png        drawable-hdpi/            awesomeimage.png        drawable-mdpi/            awesomeimage.png        drawable-ldpi/            awesomeimage.png
每当你引用@drawable/awesomeimage时,系统就会根据屏幕的密度选择适当的位图。

注意:低密度(ldpi)资源并不总是必要的。当您提供hdpi的资产时,系统会将其缩减一半,以适当地适合ldpi的屏幕。

关于为你的应用创建图标资源的更多提示和指导方针,请参见图标设计指南。


三、支持不同版本平台

虽然最新版的Android经常为你的应用提供很棒的api,但你应该继续支持老版本的Android,直到更多的设备被更新。这一课向您展示了如何利用最新的api,同时继续支持较老的版本。

根据访问Google Play商店的设备数量,平台版本的指示板定期更新,以显示运行每个版本Android的活动设备的分布情况。一般来说,支持90%的活动设备是一种很好的做法,同时把你的应用程序定位到最新版本。

提示:为了在几个Android版本中提供最好的特性和功能,你应该在你的应用中使用Android支持库,这允许你在旧版本上使用最近的几个平台api。


1.指定最小和目标API级别

AndroidManifest.xml文件描述了您的应用程序的详细信息,并确定了它支持的Android版本。具体来说,minSdkVersion和targetSdkVersion属性可以识别应用程序兼容的最低API级别,以及针对应用程序设计和测试的API级别最高的API级别

例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />    ...</manifest>
随着新版Android的发布,一些风格和行为可能会改变。为了让你的应用能够利用这些变化,并确保你的应用符合每个用户的设备风格,你应该设置targetSdkVersion值来匹配最新的Android版本


2.在运行时检查系统版本

Android为构建常量类中的每个平台版本提供了独特的代码。在您的应用程序中使用这些代码来构建条件,确保那些依赖于更高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-v 11/)中不需要单独的版本。

3.使用平台样式和主题

Android提供了用户体验主题,给应用程序提供了底层操作系统的外观和感觉。这些主题可以在manifest文件中应用到您的应用程序中。通过使用这些内置的风格和主题,你的应用将会自然地跟随Android的最新外观和感觉。


让你的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">
要将主题应用于整个应用程序(所有活动),请将android:theme 属性添加到元素:<application> :
<application android:theme="@style/CustomTheme">

更多的关于创建和使用主题,阅读风格和主题指南。

原创粉丝点击