发布时间:2017-03-28责任编辑:朱明 浏览:1432

(该图片中的每一个矩形都代表着一种尺寸的Android设备)
众所周知,随着Android版本的迭代更新,机型尺寸各种各样,于是屏幕适配就成了Android开发中很重要的一环。Android屏幕适配可能一些开发者都会遇到这样的问题,今天就来分享下屏幕适配,你会发现其实Android屏幕适配也可以很简单。
本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法:
让你的布局能充分的自适应屏幕
根据屏幕的配置来加载合适的UI布局
确保正确的布局应用在正确的设备屏幕上
提供可以根据屏幕大小自动伸缩的图片
为了确保你的布局能够自适应各种不同屏幕大小,你应该在布局的视图中使用"wrap_content"和"match_parent"来确定它的宽和高。如果你使用了"wrap_content",相应视图的宽和高就会被设定成刚好能够包含视图中内容的最小值。而如果你使用了"match_parent",就会让视图的宽和高延伸至充满整个父布局。
通过使用"wrap_content"和"match_parent"来替代硬编码的方式定义视图大小,你的视图要么仅仅使用了需要的那边一点空间,要么就会充满所有可用的空间。例如:

注意上面的例子中是如何使用"wrap_content"和"match_parent"来给控件定义宽高的,这让整个布局可以正确地适应不同屏幕的大小,甚至是横屏。
下图是这个布局分别在竖屏和横屏时显示的结果,注意控件的宽和高是根据屏幕自适应的。
使用RelativeLayout
通过多层嵌套LinearLayout和组合使用"wrap_content"和"match_parent"已经可以构建出足够复杂的布局。但是LinearLayout无法允许你准确地控制子视图之前的位置关系,所有LinearLayout中的子视图只能简单的一个挨着一个地排列。如果你需要让子视图能够有更多的排列方式,而不是简单地排成一行或一列,使用RelativeLayout将会是更好的解决方案。RelativeLayout允许布局的子控件之间使用相对定位的方式控制控件的位置,比如你可以让一个子视图居屏幕左侧对齐,让另一个子视图居屏幕右侧对齐。

下图展示了这个布局在手机、平板模拟器屏幕上显示的结果。

可以注意到,即使屏幕的大小改变,视图之前的相对位置都没有改变。
虽然使用以上几种方式可以解决屏幕适配性的问题,但是那些通过伸缩控件来适应各种不同屏幕大小的布局,未必就是提供了最好的用户体验。我们可以通过使用配置限定符,在运行时根据当前的设备配置自动选择合适的资源了。
使用Size限定符:
现在有很多的应用程序为了支持大屏设备,都会实现“two pane”模式(程序会在左侧的面板上展示一个包含子项的List,在右侧面板上展示内容)。平板和电视设备的屏幕都很大,足够同时显示两个面板,而手机屏幕一次只能显示一个面板,两个面板需要分开显示。所以,为了实现这种布局,出现了一下布局:
res/layout/main.xml single pane单面板(默认)布局:

res/layout-large/main.xml two-pane双面板布局:

请注意第二个布局的目录名中包含了large限定符,那些被定义为大屏的设备(比如7寸以上的平板)会自动加载此布局,而小屏设备会加载另一个默认的布局。
Smallest-width限定符允许你设定一个具体的最小值(以dp为单位)来指定屏幕。例如,7寸的平板最小宽度是600dp,所以如果你想让你的UI在这种屏幕上显示two pane,在更小的屏幕上显示single pane,你可以使用sw600dp来表示你想在600dp以上宽度的屏幕上使用two pane模式。
res/layout/main.xml single pane单面板(默认)布局:

res/layout-sw600dp/main.xml two-pane双面板布局:

这意味着,那些最小屏幕宽度大于600dp的设备会选择res/layout-sw600dp/main.xml(two-pane)布局,而更小屏幕的设备将会选择res/layout/main.xml(single-pane)布局。
总结:
本文根据现今主流Android的适配方法,以逻辑清晰的方式进行了主流Android适配方法的整理,如有问题。以及遗漏方法,欢迎指正后续继续整理。
敬业工作室 供稿