全世界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.
相关推荐
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 ...
Exception in thread "main" java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7Padding https://www.codeprj.com/blog/92cdc41.html
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 ...
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.
ASPICE框架可以分为三大类过程组:管理过程组(Management Process Group)、支持过程组(Supporting Process Group)和系统工程过程组(System Engineering Process Group),同时还包括软件工程过程组(Software ...
vRAN分离式架构下的非理想前传haul生态系统 vRAN(Virtualized Radio Access Network)是当前5G网络架构中的一种关键技术,它可以提供灵活、高效、低成本的无线接入网络解决方案。然而,vRAN系统的前传haul链路却...
【标题】"Supporting_information_a_time-reversible_integrator_for_local_control_theory" 是一篇与计算物理学和控制系统理论相关的研究文章的补充材料。标题中的“time-reversible integrator”指的是一个特殊的...
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.
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...
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 ...
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. ...
4:2015》是国际标准化组织(ISO)和国际电工委员会(IEC)联合制定的一项标准,该标准属于信息技术领域,特别是涉及可信平台模块(Trusted Platform Module, TPM)库的一部分,具体为支持性程序(Supporting ...
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.
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 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
「安全人才」Beyond_the_Ballot_Box_Securing_Americas_Supporting_Election_Technology - 安全培训 APT攻击 信息安全 漏洞预警 安全活动 AI安全
从描述中,“Low-Power and Low-Cost 14-nm FinFET RFIC Supporting Legacy Cellular and 5G FR1”提到的14nm FinFET RFIC代表了这项技术使用了先进的14纳米制程技术,且采用了FinFET晶体管结构。FinFET是一种三维...
8. **ISO_26262-8 Supporting processes**:支持性过程涵盖了一些辅助活动,如文档管理、人员培训、供应商管理等,这些活动对于确保整体功能安全同样至关重要。 9. **ISO_26262-9 Automotive Safety Integrity ...
NGSIM US-101和I-80数据集