Android的适配分为3个方面的适配:语言、屏幕、android版本的适配。
本节只讲第二种—屏幕的适配:
Android的不同屏幕可以通过2个属性划分:尺寸、密度。可预料到我们的app会被安装在一系列的尺寸、密度不同的屏幕中。因此,我们应该包含一些可以替代的资源来优化我们的app在不同屏幕下的显示效果。
4种常见的尺寸: small, normal, large, xlarge。
4种常见的密度: low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)。
用来适配不同屏幕的布局和图片资源,需要放在单独的文件夹中,就想是区分语言那样。
众所周知,屏幕的方向(水平、垂直)也被是为屏幕尺寸的一种,所以很多app都应该修改布局来让用户在每个方向有更好的体验。
①创建不同的布局
为了优化app在不同屏幕尺寸上的用户体验,我们应该为每个屏幕尺寸创建单独的xml布局文件。每个布局都应该存放在合适的资源文件夹下,并以尺寸做后缀命名。例如一个适用于大屏幕的布局文件应该放在res/layout-large下。
注意:android会自动调节布局来更好的适应屏幕。因此,针对不同屏幕的布局文件不需要过度担心UI组件的绝对大小,跟应该集中调节那些可能影响用户体验的布局结构(例如,重要视图与同级视图之间的位置、或者尺寸)。
例如,一个项目包含一个默认的布局和一个针对大屏幕的替换布局。

MyProject/ 
 res/ 
 layout/ 
 main.xml 
 layout-large/ 
 main.xml


文件的名字必须命名为一样,但是他们在匹配的屏幕尺寸中提供不同的内容去优化UI。
你经常使用的最简单的对布局文件的引用:

@Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 }

系统根据app运行设备的屏幕尺寸,从合适的布局文件夹下加载布局文件。想知道更多android如何选择合适的资源,请参考 Providing Resources guide。
另外一个例子,这个项目包含一个可替换的水平方向布局文件夹。

MyProject/ 
 res/ 
 layout/ 
 main.xml 
 layout-land/ 
 main.xml

默认的,layout/main.xml被用于垂直方向。
如果你想为大屏幕提供一个水平布局,你需要同时使用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及其以上版本支持一种定义屏幕尺寸的新方法,允许你根据屏幕的最小宽度和高度的非密度制约像素,指定屏幕的资源。本节并没有讲到这种技术。
②创建不同的图片资源
你应该一直提供图片资源给合适的密度桶:low, medium, high and extra-high density。这有助于在所有的屏幕上取得高品质效果和性能。
为了生成这些图片,你应该先确保你生成的是矢量图,生成每个密度的图片都遵循以下尺寸规范:
xhdpi: 2.0
hdpi: 1.5
mdpi: 1.0 (baseline)
ldpi: 0.75
就是说,如果你为xhdpi设备生成来一个200×200的图片,那你应该给hdpi生成150×150的图片,给mdpi生成100×100的图片,给ldpi生成75×75的图片。
然后,把这些文件放入合适的资源目录下:

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


任何时候你引用 @drawable/awesomeimage,系统都会根据屏幕密度选择合适的图片。
注意:Low-density (ldpi)并不是必须的。当你提供hdpi资源后,系统会缩放其一半来适配ldpi屏幕。