Getting_Started----Supporting Different Devices

        全世界Android设备有许多种形状和尺寸。正因为android设备类型众多,你的应用能有机会拥有巨大量的用户。你的app要在android平台上尽可能的成功,你需要适配各种设备。你应该考虑的一些主要的方面有:不同的语言、屏幕尺寸和不同的android的平台。

      本课教你如何使用基本的平台特性(指选择合适的资源)和其他的特性使你的应用在各种android设备上能兼容,并提供和优化用户体验。并且只需要一个应用包(APK)

        Lessons:

        支持不同的语言:

               通过可选的字符串资源以支持多语言

        支持不同的屏幕

               学习怎么优化用户在不同的屏幕和分辨率上的体验

        支持不同的平台版本

               学习如何在旧版本上使用新版本的APIs

      Supporting Different Languages

        从App代码里抽取UI字符串然后保存在另外的文件是一个好的编程实践。Android在每个工程里提供了一个专门的资源目录使得其变得容易。

        如果你使用SDK工具(read Creating an Android Project)产生你的工程,该工具会在工程的根目录产生一个res/目录。在该res/目录下有各种类型资源的子目录。该目录下也有几个默认的文件,例如:res/values/strings.xml,该文件存放字符串值。

         Create Locale Directories and String Files

        为了支持更多的语言,在res/里产生更多的values目录。该目录包含一个连字符和ISO语言代码,并以连字符和ISO语言代码结尾。例如,values-es/。Android在运行时根据设置的Locale设置加载合适的资源。更多的信息,see Providing Alternative Resources

        一旦你已决定了你将支持的语言,产生资源子目录和string资源文件。例如:

        

MyProject/
    res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml

         加各个Locale字符串资源进入合适的文件。

        在运行时,Android系统会根据用户设备当前的Locale设置来使用合适的String资源。

        例如,下面是不同语言对应的不同字符串资源。

       English(default locale),/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>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title">Mon Application</string>
    <string name="hello_world">Bonjour le monde !</string>
</resources>

    注:你能使用Locale标识符(或者任何配置标识符)在任何资源类型上,例如,如果你想提供bitmap drawable的本地化版本。更过的信息,see  Localization

       Use the String Resources

       你能在你的源代码里引用string资源和其他的XML文件。通过定义在<string>元素的name属性的资源名来应用。

      在你的源代码里,你能使用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 = new TextView(this);
textView.setText(R.string.hello_world);

      在其他的XML文件,你能通过@string/<string_name>的语法引用字符串资源。

      例如:

     

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

    

      Supporting Different Screens

        Android主要根据如下两个属性来对设备屏幕进行分类:屏幕大小(size)和屏幕密度(density)。你肯定期望你的app安装在不同的尺寸和分辨率的Android设备上。因此,你应该针对不同的屏幕大小和密度提供不同的资源已优化app界面。       

  • There are four generalized sizes: small, normal, large, xlarge
  • And four generalized densities: low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)

        为了声明用于不同屏幕的布局和bitmaps,你必须将不同的资源放在相关的各自的资源目录,与上节讲的支持不同的语言相似。

        注意:屏幕方向(水平或者垂直)被认为是屏幕的改变,因此,app应该修改布局以优化用户在每个方向的体验。

        Create Different Layouts

        为了优化你的app在不同屏幕尺寸上的用户体验,你应该对应每个想要支持的屏幕尺寸产生一个layout XML。每个layout应该保存到相应的目录下,这些目录应该命名有一个-<screen_size>后缀。例如,对应于大屏幕的布局文件应该保存在res/layout-large/目录下。

        注:Android会自动的挑选合适的布局去适配屏幕大小。因此,你的布局不用担心在不同屏幕上的UI元素的绝对大小。而是让你的布局专注于影响用户体验的布局结构上(例如重要的视图相对应子视图的大小的位置)。

        例如:如下工程包含了默认的布局和用于large screens的布局

        

MyProject/
    res/
        layout/
            main.xml
        layout-large/
            main.xml
         这些布局文件的名字必须完全相同,但是为了适配响应的屏幕大小,它们的内容应该是不同的。

         在app里应用这些layout文件和之前无异:

    

@Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
}
         系统会根据app运行的设备的屏幕尺寸大小选择相应的目录下的合适的布局文件。更多的关于Android如何选择合适的有效的资源的信息请参见 Providing Resources

        如下是一个支持水平方向布局的例子:   

MyProject/
    res/
        layout/
            main.xml
        layout-land/
            main.xml
        默认的,layout/main.xml被用于垂直方向。

        如果你想要提供一个既支持水平方向同时又要支持large屏幕的布局,那么你需要同时使用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及以上的版本提供了一种更高级的定义屏幕大小的方法,该方式允许你基于密度像素无关的屏幕最小高度和宽度指定资源。本文并未覆盖这种新技术。更多的信息,read  Designing for Multiple Screens.

          Create Different Bitmaps

         你应该提供适合不同屏幕密度的bitmap资源:低、中、高和超高密度。这有助于你在所有的屏幕密度上取得好的图片质量和性能。

         为了产生这样的这些图片,你应该让你的最原始的资源使用向量格式,产生如下的不同size规模的不同的密度images:          

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

        这意思是如果你为xhdpi设置产生一个200*200的iamge,那么你应该为hdpi设置产生一个相同的150*150的图片资源,为mdpi产生100*100的相同的图片资源,那么ldpi设置则是75*75.

        然后,放这些图片文件到相应的drawable资源目录:

MyProject/
    res/
        drawable-xhdpi/
            awesomeimage.png
        drawable-hdpi/
            awesomeimage.png
        drawable-mdpi/
            awesomeimage.png
        drawable-ldpi/
            awesomeimage.png

       不管什么时候你引用@drawable/awesomeimage,系统会基于屏幕密度自动的选择合适的bitmap。

        

       注:低密度(ldpi)资源并不是总是必要的,当你提供hdpi assets时,系统会scales(伸缩)小50%的hdpi资源去适应ldpi屏幕。

       

      更多的关于icon assets的tips和向导,see conography design guide.

   

        

        Supporting Different Platform Versions

         Android最新的版本提供了大量的新的APIs。然后,你应该继续支持Android更早的版本。直到更多的设备更新上来为止。本文告诉你在很好的支持旧版本的同时怎么使用最新的APIs。
        Platform Versions仪表盘显示了运行在不同Android版本上的活动设备的分布。这些分布是基于访问Google Play Store的设备统计出来的。一般地,实际中,对活动设备的支持率达到90%以上就可以了。同时让你的app运行的目标版本为最新的版本。

       

      Tip:为了在不同的Android版本间提供最好的特性和功能,你应该在你的app里使用Android Support Library,Android Support Library允许你在旧的Android版本上使用最新的APIs。

       Specify Minimum and Target API Levels

        AndroidManifest.xml文件描述了app的详细信息,标识了支持的android 版本。特别地,<uses-sdk元素的minSdkVersion和targetSdkVersion属性指定了app支持和兼容的最低API版本和最高API版本。最高API版本(targetSdkVersion)也表明了你的app设计和测试所使用的SDK Version

      例如:

      

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

        当Android新版本发版时,一些style和行为可能发生改变。为了使你的app能使用这些新特性,同时适配各种不同版本设备的样式,你应该设置targetSdkVersion值到最新的Android version。

       Check System Version at Runtime

       Android在Build常量类里为每个SDK Version 提供了一个唯一的版本Code。在你的app的build条件里使用这些平台码,确保你的代码里依赖更高API的版本在APIs有效时才执行。如下:

       

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",你的app使用了Android3.0或者更高的版本里的才有的ActionBar。那么你为了添加menu item到action bar里,你需要在menu resource XMl里设置android:showAsAction="ifRoom" 。这样做是安全的,虽然可能运行在不同的sdk版本上,因为Android以前的版本会简单的忽略showAsAction 属性(那即是,你不需要在res/menu-v11里写一个专门的单独的XML文件)

        Use Platform Styles and Themes 

        Android提供用户通用themes,这些themes使得app看起来同Android操作系统的外观。这些Themes在manifest 文件里能应用到你的app里。通过使用这些Styles和Themes,你的app将和每一个最新发布的版本的外观和样式一样。

       为了使得你的activity看上去像一个dialog:     

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

   

      为了让你的activity有透明背景:  

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

     To apply your own custom theme defined in /res/values/styles.xml:     

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

  

        为了将theme应用到整个app(所有的activity),添加android:theme属性到<application>元素节点。

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

  

      For more about creating and using themes, read the Styles and Themes guide.

猜你喜欢

转载自xhmj12.iteye.com/blog/2079461