4、怎么解决这些问题
其实给出的解决方法也是官方文档中,这里会简单的写一点,有条件可以看一下参考中的链接。
4.1 Supporting Different Devices
4.1.1支持不同的语言
这一点是应用怎么实现国际化,使用values文件添加config_qualifier属性,例如:
MyProject/
res/
values/
strings.xml
values-es/
strings.xml
values-fr/
strings.xml
4.1.2支持不同的屏幕
Android手机的屏幕有两个属性,屏幕尺寸、屏幕密度。前面也介绍了屏幕的尺寸、密度。解决这个问题,我们需要声明不同的布局,不同的图片资源。屏幕的方向(横屏、竖屏)也是在这处理的。这个和前面国际化处理一样的,使用资源文件添加config_qualifier属性。
4.1.2.1 Create Different Layouts
Android中一般分为四种尺寸: small, normal, large, xlarge。
一般创建不同的布局来适配这四种尺寸。
适配不同尺寸可以创建下面目录:
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
适配横屏、竖屏可以创建如下目录:
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
如果需要同时适配,需要更多的条件:
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中为了适配平板的开发,增加了smallestWidth属性。详情参考。
4.1.2.2 Create Different Bitmaps
Android中图片资源是必不可少的,并且建议提供四种图片以适应不同的屏幕密度。Android中广义的屏幕密度分为4种( low, medium, high and extra-high )。他们的比例关系如下:
01.xhdpi: 2.0
02.hdpi: 1.5
03.mdpi: 1.0 (baseline)
04.ldpi: 0.75
如果你在mdpi中放置200x200的图片,建议你在mdpi中放置100x100的图片。
图片资源文件如下:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
现在已经不建议使用ldpi,因为这样的手机基本没了大笑。
4.1.3支持不同的平台版本
Android版本的升级就会带来新的api,我们怎么适配不同的系统版本呢。
1、使用 Android Support Library
2、AndroidManifest文件配置minSdk、targetSdk。
01.
02.
03. ...
04.
3、检测版本号,根据版本号调用api
01.private void setUpActionBar() {
02. // Make sure we're running on Honeycomb or higher to use ActionBar APIs
03. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
04. ActionBar actionBar = getActionBar();
05. actionBar.setDisplayHomeAsUpEnabled(true);
06. }
07.}
4、使用平台的Styles and Themes
4.2 Designing for Multiple Screens
Android设备包含phone、glass、watch、autocar等等,这些屏幕尺寸从小到watch大到电视,我们的应用能够兼容这么多的尺寸是很重要的。
4.2.1支持不同屏幕尺寸
4.2.1.1 Use "wrap_content" and "match_parent"
UI实现中view和layout的高度、宽度使用"wrap_content" and "match_parent",不使用固定值。
4.2.1.2 Use RelativeLayout
UI实现中layout尽量使用RelativeLayout,这样可以控制相对位置,还能减少布局的层级。
4.2.1.3 Use Size Qualifiers
距离使用dp和字体使用sp作为单位,不使用px。
4.2.1.4 Use the Smallest-width Qualifier
使用Smallest-width Qualifier,这个是Android3.2开始支持的,以适配平板。
res/layout-sw600dp/main.xml
4.2.1.5 Use Layout Aliases
使用Layout的别名,以适配不同尺寸的屏幕。
4.2.1.6 Use Orientation Qualifiers
使用屏幕方向属性,以支持横屏、竖屏。
4.2.1.7 Use Nine-patch Bitmaps
使用.9图片,.9图片能很好地支持横向、竖向拉伸。
4.2.2支持不同屏幕密度
见4.1.2.2 Create Different Bitmaps
4.2.3创建自适应界面
这里主要是运行时检测,什么是运行时检测呢,就是在java代码中判断需要的view是否找到(是否为空),例如下面的代码。
01.public class NewsReaderActivity extends FragmentActivity {
02. boolean mIsDualPane;
03.
04. @Override
05. public void onCreate(Bundle savedInstanceState) {
06. super.onCreate(savedInstanceState);
07. setContentView(R.layout.main_layout);
08.
09. View articleView = findViewById(R.id.article);
10. mIsDualPane = articleView != null &&
11. articleView.getVisibility() == View.VISIBLE;
12. }
13.}
Android应用如何支持屏幕多尺寸多分辨率问题基本就这些,更多经验需要从实践中总结。
后记:很久的时候和一位小伙伴讨论过应用适配的问题,说好了要总结出来的,现在权当实现诺言,写的有些凌乱,有读不通的通信请留言。