`

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.

分享到:
评论

相关推荐

    HART_HCF_SPEC-054-FSK物理层规范_A_8V0.PDF

    This revision allows for new HART network topologies to exist, supporting new device types. Document Format: The document was reformatted to align itself with IEC/ISO directives. This standard was ...

    jce_policy-8.AES加密版本.zip

    Exception in thread "main" java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7Padding https://www.codeprj.com/blog/92cdc41.html

    TC39xXX_TC39xXP_PB-PB-v01_00-EN.pdf

    Safety is the core know-how of Infineon, and all products provide safety mechanism (including but not limited to lock-step cores, LBIST, ECC RAM) to ensure a safety platform supporting ASIL-D ISO ...

    ICIS-report_Classification_Identification-_and_BIM_final_2017-10.pdf

    This ICIS report states that a number of existing national... But it also questions if currently used classification is optimal for supporting the collaborative process with BIM and all parties involved.

    2-11_automotive-spice_v3-0_poster.pdf

    ASPICE框架可以分为三大类过程组:管理过程组(Management Process Group)、支持过程组(Supporting Process Group)和系统工程过程组(System Engineering Process Group),同时还包括软件工程过程组(Software ...

    VRAN_WP_final-1.pdf

    vRAN分离式架构下的非理想前传haul生态系统 vRAN(Virtualized Radio Access Network)是当前5G网络架构中的一种关键技术,它可以提供灵活、高效、低成本的无线接入网络解决方案。然而,vRAN系统的前传haul链路却...

    Supporting_information_a_time-reversible_integrator_for_local_control_theory

    【标题】"Supporting_information_a_time-reversible_integrator_for_local_control_theory" 是一篇与计算物理学和控制系统理论相关的研究文章的补充材料。标题中的“time-reversible integrator”指的是一个特殊的...

    ISO_IEC_23001-7_2011.pdf

    ISO/IEC 23001-7:2011 specifies a common encryption format for use in any file format based on ISO/IEC 14496-12, the ISO base media file ... up to the DRM system or systems supporting the 'cenc' scheme.

    ci-plus_specification_v2-0-1.pdf

    This specification provides the description of a CI Plus LLP implementation for a device supporting the USB form factor, profiles the TS 103 605 specification, and specifies the form factor(s) (PCMCIA...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    Version 1.7 ----------- - ADD: Delphi/CBuilder 10.2 Tokyo now supported. - ADD: Delphi/CBuilder 10.1 Berlin now supported. - ADD: Delphi/CBuilder 10 Seattle now supported. - ADD: Delphi/CBuilder XE8 ...

    IBM3650M4驱动

    supporting Microsoft Windows Server 2003, 2008 and 2008 R2. 1.2 Limitations: - This update will not install if it is equivalent to or less than the currently installed device driver version. ...

    c066513_ISO_IEC_11889-4_2015.pdf

    4:2015》是国际标准化组织(ISO)和国际电工委员会(IEC)联合制定的一项标准,该标准属于信息技术领域,特别是涉及可信平台模块(Trusted Platform Module, TPM)库的一部分,具体为支持性程序(Supporting ...

    06-02-2015_05-43-24.zip_assignment

    Your class EnhancedSafeArray will augment the class SafeArray by supporting a copy constructor, a method to return the size of the array, an assignment operator, and an equality test operator.

    MCS56744_56746-DS00-RDS.pdf

    high-performance, multichip chassis supporting over 5 Tbps of aggregate bandwidth. The features, integration, and low cost of the BCM56740 set a new standard in switch fabric design, and enable system...

    linprog_net-0.5.5-src.zip_ linpr_Framework_integer programming_l

    LinProg.NET is a framework for mathematical programming implemented... This framework is supporting linear, integer, boolean and quadratic programming. Framework is written on Microsoft .NET version 2.0.

    HgtSIM_supporting_files-开源

    HgtSIM_supporting_files

    「安全人才」Beyond_the_Ballot_Box_Securing_Americas_Supporting_Elec

    「安全人才」Beyond_the_Ballot_Box_Securing_Americas_Supporting_Election_Technology - 安全培训 APT攻击 信息安全 漏洞预警 安全活动 AI安全

    ISSCC2021-Session_06V_High-Performance Receivers and Transmitters for Sub-6GHz

    从描述中,“Low-Power and Low-Cost 14-nm FinFET RFIC Supporting Legacy Cellular and 5G FR1”提到的14nm FinFET RFIC代表了这项技术使用了先进的14纳米制程技术,且采用了FinFET晶体管结构。FinFET是一种三维...

    ISO26262-Standard.rar_iso26262_iso26262 download_iso26262标准_rock

    8. **ISO_26262-8 Supporting processes**:支持性过程涵盖了一些辅助活动,如文档管理、人员培训、供应商管理等,这些活动对于确保整体功能安全同样至关重要。 9. **ISO_26262-9 Automotive Safety Integrity ...

    Next_Generation_Simulation__NGSIM__Vehicle_Trajectories_and_Supporting_Data.zip

    NGSIM US-101和I-80数据集

Global site tag (gtag.js) - Google Analytics