2015.10.22
个人英文阅读练习笔记(低水准)。原文地址:http://developer.android.com/training/basics/supporting-devices/index.html

2015.10.22
世界上有许多不同形状和尺寸的android设备。因为android设备类型的多样性,你的android应用程序将会有一个巨大的市场。为了能在各种设备上成功的运行android应用,您的应用程序需要适应各类型的设备的配置。也就是说您需要考虑一些重要的变化因素,包括不同的语言,屏幕尺寸以及android的各种平台。

本笔记将会教会您如何用一个应用包(APK)去所使用基础平台的特性去借用资源或者平台其它特性,以让应用程序在兼容android的不同设备上都够有较好的用户体验。

1. 支持不同的语言

学习怎么使用其它的字符串资源支持多种语言。

从应用程序中提取UI字符串并把它们保存在外部文件中是个不错的实践。利用android工程下的资源目录会很容易完成这件事情。

如果您是通过android SDK工具创建的工程,此工具会在创建一个res/的顶层目录。res/下是各种类型资源的子目录。子目录下有一些如保存字符串值的/res/values/stromgs.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) 使用字符串资源

您可以在程序代码以及其他XML文件中引用被元素定义的资源的名字属性。

在您的源码中,您可以用R.string.的语法访问字符串资源。接受字符串资源的方式有很多种。
例如:

// 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文件中,当此文件属性要接受一个字符串值时您可以通过@string/的语法访问一个字符串资源。

例如:

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

2. 支持不同的屏幕

学习针对不同屏幕尺寸和密度的用户体验的优化。

android用“尺寸”和“密度”两个特性来归类设备屏幕。您应该挺期待自己的应用程序能够安装到具有不同尺寸和密度的android设备上。因此,您应该包含一些可选的资源来针对具有不同尺寸以及密度的屏幕以来应用程序的显示。
- 通常有4种尺寸:小,正常,大,超大
- 以及4种密度:低(ldpi),中(mdpi),高(hdpi),超高(xhdpi)

如果您要为不同的屏幕声明对应的布局和位图,您必须要将这些资源放在独立的目录中,就像处理不同语言的字符串一样。

同时也要屏幕选择所带来的屏幕尺寸变化,所以应用程序英爱修改布局来优化屏幕在每个方向上的用户体验。

(1) 创建不同的布局

为了优化在不同屏幕尺寸上的用户体验,您应该为每一个想要支持的不同尺寸的屏幕创建一个XML布局文件。 每个文件都应该保存到合适的资源文件下,并用-后缀命名。例如,一个大屏的布局文件应该保存在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);}

系统根据应用程序所运行设备的屏幕尺寸从合适的布局目录下加载布局文件。关于系统怎么选择合适的资源请参考“ Providing Resources ”。

另一个例子,某工程包含一个landscape 方向的布局文件:
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
layout/main.xml文件用于portrait方向。

如果您为landscape方向提供一个特殊的布局,同时包含大屏幕布局文件,那么您可以包含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
注:android3.2及其以上支持一种高级方法,这种方法通过指定以独立密度像素方式设定的屏幕最小宽度和高度方式的资源来适应屏幕大小。具体见“ Designing for Multiple Screens”。

(2) 创建不同的位图

您应该为常见的密度目录内提供合适的位图资源:低,中,高以及超高。这能够帮助您拥有一个较好的界面质量,同时也能让应用程序运行在 各种密度的屏幕上。

为了生成合适的图片,您应该将原有的图片以适量的方式转换成以下规定范围内的图片:

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

以上数字表示的含义为,您需要为xhdpi设备生成200x200的图片,为hdpi设备生成150x150的图片,为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资源(assets,Iconography design guide.)时,系统通过降低图片一半尺寸的方式去适应屏幕密度。

3. 支持不同版本的平台

学习如何在使用android新版本的APIs的同时还能够继续支持旧版本的APIs。

android最新的版本为应用程序提供了大量的APIs,在拥有旧版本android系统中您的应用程序应该要能够继续支持。此笔记将向您展示如何利用最新的APIs来继续支持旧版本。

基于设备访问Google Play Store的设备,能够知道正在运行设备所使用的android系统。在让你的程序更新到最新版本时,应用程序能够支持90%的设备是一个好的实践。

注:为了提供最佳特征及功能去访问多个android版本,您应该在您的应用程序中使用Android Support Library ,此库允许您使用几种最近平台上的APIs在旧版本之上。

(1) 指定最低版本及目标API

AndroidManifest.xml文件描述了应用程序的信息并指定了锁支持的android版本。特别的,

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

当新的android系统发布时,一些风格和行为有可能会发生改变。为了能让您的应用程序利用这些改变并确保您的应用程序能够在每个用户设备上适应这些改变,您应该在应用程序中设置targetSdkVersion的值去匹配最新的android系统版本。

(2) 在运行时检查系统版本

android在Build常量类中为android的平台提供了一些特殊的代码。在应用程序中用这些代码来构建条件,保证高版本的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属性,而不用担心老版本来执行这些代码。例如,如果您设置了targetSdkVersion=”11”,您的应用程序包含android3.0及其以上才有的ActionBar。然后添加了菜单条目到活动条,你需要设置在您的菜单资源XML文件中添加android:showAsAction=”ifRoom”。这种在XML中跨版本的操作是安全的,因为在不支持showAsAction属性的android版本会忽略这个属性(也就是说,不需要用一个独立的目录res/menu-v11来保存这个信息)。

(3) 使用平台风格和主题

android提供跟操作系统一样的外观及感觉给应用程序。这些操作系统下的主题可以被包含在显示文件(AndroidManifest.xml)中。通过使用这些风格和主题,你的应用程序会自然的跟随每经发布的android系统的外观和感觉。

让您的活动看起来像一个对话框:

让您的活动有一个透明的背景:

应用自定义在/res/values/styles.xml中的主题:

应用主题到整个应用程序中(所有的活动中),需要增添android:theme属性到元素中:

更多创建和使用主题请参考“Styles and Themes ”手册。

[2015.11.10-23:26]

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. android保存手势操作到文件&读取识别手势
  4. Android笔试的一部分知识点
  5. 关于android应用程序的入口
  6. android 2.android 系统架构与应用程序目录介绍
  7. Android模拟器环境中安装和删除应用程序
  8. Android(安卓)2.2开始支持安装APP2SD卡上
  9. Android刷Recovery

随机推荐

  1. android UiAutomator一个完整的个人信息
  2. Android(安卓)系统应用调用,intent的使用
  3. 比较好的android 开源项目
  4. android 简单服务实现
  5. android 下载图片保存在sdcard并显示可拖
  6. [Android]android.os 源代码中的Looper,H
  7. Android(安卓)-- 与WEB交互在同一个会话S
  8. Android java.lang.RuntimeException: ta
  9. Intent打开各种类型的文件
  10. Android Retrofit2 设置请求头Header