如果你想要在Android领域取得更大的成功,那么你的应用程序必须适应各种各样的设备配置。很多重要的变化因素你都要考虑到,包括不同的语言、屏幕大小以及android平台的版本。




接下来就开始学习如何使用基本的平台特性,利用替代资源和其他特性,使你的应用程序可以提供一个优化用户体验各种不同的android设备,使用单一应用程序包(APK)。


一、 支持不同的语言




它总是一个不错的实践从你的应用程序的UI字符串提取代码,并保存在一个外部文件。Android使得这个容易与资源目录在每个Android项目。




如果您使用Android SDK工具创建了您的项目(阅读创建一个Android项目),该工具在顶级项目中创建一个res /目录。在这个res /目录的子目录为各种类型的资源。也有一些默认的文件,例如res /values/string.xml,保存你的字符串值。

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




        一旦你决定你的语言支持,创建资源的子目录和字符串资源文件。如下例子:

  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><stringname="title">My Application</string><stringname="hello_world">Hello World!</string>   </resources>


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

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


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

<?xml version="1.0" encoding="utf-8"?>   <resources><stringname="title">Mon Application</string><stringname="hello_world">Bonjour le monde !</string>   </resources>


1.2使用字符串资源

     在你的源代码中,你可以引用一个字符串资源和语法​​R.string.<string_name>。有各种各样的方法接受字符串资源这种方式。​

​   例子:​

​    // Get a string resource from your app's​​Resources​​  ​

​         String hello=​​getResources()​​.getString(R.string.hello_world);​

​  // Or supply a string resource to a method that requires a string​

​        TextView textView=newTextView(this);​

​        textView.setText(R.string.hello_world);​




     在其他的XML文件中,每当XML属性接受一个字符串值时,您可以引用一个字符串资源与语法@string / <string_name>

   例子:

     

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


二、支持不同的屏幕

         Android设备屏幕使用两种普通的分类属性:大小和密度。你应该期待你的应用程序将被安装在设备与屏幕范围在两个大小和密度。因此,你应该包括一些可替代资源,为不同的屏幕大小和密度,优化你的应用的外观。

         声明不同的布局和位图你要用不同的屏幕,还应注意,屏幕方向(风景或肖像)被认为是一个变化的屏幕大小,所以许多应用程序应该在每个方向上修改布局来优化用户体验。

2.1创建不同的布局

  优化你的用户体验不同屏幕大小,为每一个你想要支持的屏幕大小,你应该创建一个独一无二的布局XML文件。每一个布局都保存在恰当的资源目录里,命名为带-<screen_size>的后缀。例如,大屏幕的独特布局应保存在res/layout-large/ 。

    MyProject/

                res/

                   layout/

                         main.xml

                  layout-large/

                        main.xml

    文件名称必须是完全相同,但它们的内容是不同的,为相应的屏幕大小,提供一个优化的UI。

      @Override

                     protectedvoid onCreate(Bundle savedInstanceState){

                            super.onCreate(savedInstanceState);

                            setContentView(R.layout.main);

            }

当你的应用程序正在运行时,系统在基于设备的屏幕大小的前提下从适当的布局目录中加载布局文件。更多的信息关于Android如何选择适当的资源是可用的资源提供指导




如果你想要提供一个特殊的布局景观,包括在大屏幕上,那么您需要使用两个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

2.2创建不同的位图

你应该总是提供位图资源,正确地扩展到每个广义密度桶:低、中、高和超高密度。这有助于你在所有屏幕密度上实现良好的图形质量和性能。

产生这些图像,你应该开始以你的原始资源并生成图像的矢量格式为每个密度使用下面的尺度:

 

  • xhdpi: 2.0
  • hdpi: 1.5
  • mdpi: 1.0 (baseline)
  • ldpi: 0.75low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)
     
    这意味着如果你为超高精度设备生成一个200 x200的图片,则在高精度设备中你应该生成相同的资源为150 x150,而在中精度的设备中生成相同的资源为100 x100,那么在低精度的设备中生成相同资源为75 x75 
     
    MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
    任何时候你参考@drawable / awesomeimage,系统选择合适的位图基于屏幕的密度。
     
    三、支持不同的平台版本
    当最新版本的Android经常为您的应用程序提供极好的api时,你应该继续支持旧版本的Android直到更多的设备得到更新。

    为了在几个Android版本提供最好的特性和功能,您应该在你的应用程序上使用Android支持图书馆的功能,它允许你在老版本上使用最近的一些平台api。

    3.1指定最小值和目标API的级别
    AndroidManifest.xml文件描述应用程序的细节和能识别哪些版本的Android支持。具体来说,minSdkVersion和targetSdkVersion属性的 ​​<uses-sdk>​​元素确定最低级别的API,你的应用程序兼容和最高级别的API针对你已经设计和测试过的应用程序。

     
    例如:
    <manifestxmlns:android="http://schemas.android.com/apk/res/android" ... ><uses-sdkandroid:minSdkVersion="4"android:targetSdkVersion="15"/> ... </manifest>
    3.2检查系统在运行时的版本 Android在构建常量类中对于每个平台版本提供了一个独特的代码。使用这些代码在应用程序中构建条件,确保代码取决于更高级别的API的执行,只有当这些API是系统上可用。

     
    privatevoid setUpActionBar(){// Make sure we're running on Honeycomb or higher to use ActionBar APIsif(Build.VERSION.SDK_INT >=Build.VERSION_CODES.HONEYCOMB){ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);}}
    3.3使用平台风格和主题  
            Android提供了用户体验的主题,让应用程序的外观和感受底层操作系统。这些主题可以应用到你的应用程序中,当此主题在你的manifest文件中时。通过使用这些建立的风格和主题,你的应用程序将自然地跟随最新的外观和感受与每个新发布的Android。

          让你的activity看起来更像一个会话框:
     

    <activityandroid:theme="@android:style/Theme.Dialog">
    让你的activity 拥有一个 透明的背景:
    <activityandroid:theme="@android:style/Theme.Translucent">
    申请你自己的自定义主题应该在 ​​/res/values/styles.xml中定义​​:
    <activityandroid:theme="@style/CustomTheme">
    为你的应用程序申请一个主题, 添加 ​​android:theme​​ 属性到 ​​<application>元素中​​:
    <applicationandroid:theme="@style/CustomTheme">
    更多关于创建和使用主题,请阅读 ​​Styles and Themes​​指南.