Configuration

适配各种屏幕规格,首先要取到系统对于屏幕的配置信息,这些配置可从工具类Configuration获得。Configuration对象在Activity中通过调用getResources().getConfiguration()得到,该对象的常用属性说明如下:
touchscreen : 屏幕触摸方式。有下列几种取值定义:"未定义", "不支持触摸", "专用笔触摸", "支持手指触摸"
keyboard : 物理键盘样式。有下列几种取值定义:"未定义", "无物理键盘", "全键盘", "十二格键盘"
keyboardHidden : 键盘状态。有下列几种取值定义:"未定义", "未隐藏或软键盘", "已隐藏", "软键盘"
hardKeyboardHidden : 物理键盘状态。有下列几种取值定义:"未定义", "未隐藏", "已隐藏"
navigation : 方向控制样式。有下列几种取值定义:"未定义", "无方向控制", "方向键", "轨迹球", "滚轮"
navigationHidden : 方向控制状态。有下列几种取值定义:"未定义", "未隐藏", "已隐藏"
orientation : 屏幕方向。有下列几种取值定义:"未定义", "竖屏", "横屏"
以上属性除了屏幕方向是有用的,其他的基本没什么用。

如果属性发生变化,可重写onConfigurationChanged函数监测最新的属性值。但是由屏幕旋转导致的屏幕方向变化,按照生命周期走的是原方向onDestroy然后新方向onCreate,并不触发onConfigurationChanged方法,所以该方法基本也没机会用到。

适配竖屏/横屏

上面说到,竖屏/横屏的切换走的是Activity的生命周期流程,详细介绍参见《 Android开发笔记(三十九)Activity的生命周期》。

要对一个页面分别适配竖屏与横屏,可在res目录下创建子目录“layout-land”,该目录放的是横屏时的布局文件,而原来的layout目录放的是默认即竖屏时的布局文件。app运行时,Android会根据当前的屏幕方向,自动选择对应目录下的布局。具体的代码例子参见《 Android开发笔记(六十七)嵌入页面的碎片》,这里通过操作Fragment完成屏幕方向切换的适配。

适配竖屏与横屏的另一种方法,是在布局文件中采用ViewStub标签,此时无需新建layout目录,只要在代码中判断屏幕方向,从而选择合适的ViewStub标签加以显示。其实ViewStub标签也要指向不同的布局文件完成适配,该方法与新建layout目录的区别在于,新建layout方式是把选择布局操作交给Android系统完成,而ViewStub标签方式则是在app代码中自己完成。该方式的具体例子参见《 Android开发笔记(七十四)布局文件优化》。

适配手机/平板

Android中没有明确区分手机和平板的方法,但我们可以根据某些参数来判断,具体方法如下:
1、从Configuration对象的screenLayout属性判断当前的屏幕规格,只要是大尺寸以上的都算平板;
2、从系统服务TELEPHONY_SERVICE中获得电话管理对象TelephonyManager,然后判断该对象的电话类型getPhoneType,不能打电话的都算平板(这个可能不准确,因为有的平板也能打电话;或者如果手机没插sim卡,那也不能打电话);
3、从系统服务WINDOW_SERVICE中获得窗口管理对象WindowManager,再由该对象获得屏幕的长和宽,据此算出屏幕对角线的长度,若结果大于六英寸,则认为是平板;

判断是否平板的三种实现代码示例如下:

import android.content.Context;
import android.content.res.Configuration;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;public class TabletUtil {//SCREENLAYOUT_SIZE_SMALL : 小尺寸//SCREENLAYOUT_SIZE_NORMAL : 正常尺寸//SCREENLAYOUT_SIZE_LARGE : 大尺寸//SCREENLAYOUT_SIZE_XLARGE : 超大尺寸public static boolean isTabletByLayout(Context ctx) {boolean bTablet = false;int sizeMode = ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;if (sizeMode >= Configuration.SCREENLAYOUT_SIZE_LARGE) {bTablet = true;}return bTablet;}//PHONE_TYPE_NONE : 无//PHONE_TYPE_GSM : GSM//PHONE_TYPE_CDMA : CDMA//PHONE_TYPE_SIP : SIPpublic static boolean isTabletByPhone(Context ctx) {boolean bTablet = false;TelephonyManager telephony = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);int phoneType = telephony.getPhoneType();if (phoneType == TelephonyManager.PHONE_TYPE_NONE) {bTablet = true;}return bTablet;}public static boolean isTabletByDisplay(Context ctx) {WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();DisplayMetrics dm = new DisplayMetrics();display.getMetrics(dm);double x = Math.pow(dm.widthPixels / dm.xdpi, 2);double y = Math.pow(dm.heightPixels / dm.ydpi, 2);// 屏幕尺寸double screenInches = Math.sqrt(x + y);// 大于6尺寸则为Padif (screenInches >= 6.0) {return true;}return false;}}

适配不同屏幕尺寸

不同设备的屏幕尺寸有大有小,适配不同大小屏幕的方法也有三种:
1、在布局文件中,视图或控件的宽或高使用match_parent和wrap_content,或者设置layout_weight权重,由app自身在onMeasure测量方法中自行计算大小。测量尺寸的介绍参见《 Android开发笔记(十二)测量尺寸与下拉刷新》。
2、在代码中获得当前屏幕的分辨率,根据不同分辨率做不同处理。获取屏幕分辨率的详细说明参见《 Android开发笔记(三)屏幕分辨率》。
3、参照drawable的处理方式,不同尺寸的图片放在不同的drawable目录下,详见《 Android开发笔记(七)初识Drawable》。同样的,对于布局文件layout,我们也可以创建诸如“layout-mdpi”、“layout-hdpi”、“layout-xhdpi”等目录,分别存放中等分辨率、高分辨率、超高分辨率的布局文件,由Android在运行时自行选择最接近当前分辨率的布局。除了drawable和layout,dimens.xml中的维度定义也可区分不同的分辨率,具体做法就是创建“values-mdpi”、“values-hdpi”、“values-xhdpi”等目录,在这几个目录下分别保存已设置对应维度的dimens.xml。

点击下载本文用到的屏幕规格适配的工程代码

点此查看Android开发笔记的完整目录

Android开发笔记(八十一)屏幕规格适配相关推荐

  1. Android开发笔记(十一)自定义视图的构造方法

    自定义视图的用法 Android自带的视图常常不能满足实际开发的需求,这种情况下我们就得自定义视图(View). 首先在res\values目录下找到attrs.xml(如没有则创建之),在该属性定义 ...

  2. Android开发笔记(序)写在前面的目录

    知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教训,与网友互相切磋,从而去芜存菁进一步提升自己的水平.因此博主就想,入门的东西咱就不写了,人不能老停留在入 ...

  3. Android开发笔记(序)

    本开发笔记,借鉴与其他开发者整理的文章范例与心得体会.在这里作为开发过程中的一个总结与笔记式记录. 如有侵犯作者权益,请及时联系告知删除.俗话说:集百家成一言,去粕成金. ************** ...

  4. Android开发笔记(序)写在前面的目录大全

    转自  湖前琴亭 的博客https://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面 ...

  5. Andriod开发之二十:Android开发笔记(序)写在前面的目录

    https://blog.csdn.net/aqi00/article/details/50038385 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经验教 ...

  6. Android开发笔记(一百二十八)手机制式适配

    查看运营商与网络类型 虽然现在4G网络很普及了,但是我国幅员辽阔,4G信号在某些地方接收不良,手机连接很容易掉到3G甚至2G网络.为了让用户在低速环境也能使用App的基础功能,而不至于还在老牛破车地缓 ...

  7. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

  8. Android开发笔记(六十一)文件下载管理DownloadManager

    下载管理DownloadManager 文件下载其实是网络数据访问的一种特殊形式,使用普通的http请求也能完成,就是实现起来会繁琐一些.因为下载功能比较常用,而且业务功能相对统一,所以从Androi ...

  9. Android开发笔记(二十一)横幅轮播页Banner

    ViewPager ViewPager的概念 在前面的博文< Android开发笔记(十九)底部标签栏TabBar>中,我们提到可以在一个主页面里通过选项卡方式,切换到不同的子页面.那么在 ...

最新文章

  1. linux系统怎么查找 文件是否存在,在Linux上,如何知道一个可执行文件是否包含调试信息呢?...
  2. java和python哪个好就业2020-Java和Python哪个发展前景好?老男孩教育
  3. 史上最全!图解浏览器的工作原理
  4. nginx 配置两个域名
  5. 技术干货 | 基于 Doris 构建的小程序私域流量增长
  6. python shelve模块_python3 shelve模块的详解
  7. 语言模型(N-Gram)
  8. 汇新杯┃拼多多黄峥:普通的创业者,不普通的朋友圈_创成汇
  9. gitlable iphone_使用gitlab ci构建IOS包并发送通知消息到企业微信
  10. 苹果 macOS Big Sur 11.2.3 正式版发布
  11. python迭代器学习与简单的实践
  12. python百度文库免券下载
  13. 2018黑马39期WEB前端视频教程
  14. 【SMTP】服务端口
  15. OSChina 周二乱弹 —— 仙女抚我顶,脱发不长生
  16. 阿里巴巴开发规约之编程规约(1)
  17. 云服务器怎么存文件大小,云服务器怎么存文件大小
  18. 手写数字数据集MNIST
  19. C++程序设计的技巧-Pimple的使用
  20. 实在智能签约上海联通,共创美好智慧生活

热门文章

  1. POJ1321(深搜)
  2. Apache Hawq--优化笔记
  3. 数字信号处理1:卷积
  4. python三层设计_推荐3个Python实现算法和设计模式的工具
  5. cnn 示意图_Two-Stream CNN(双流CNN)介绍(NIPS2014)
  6. 用python自动办公 百度_用Python自动办公,做职场高手,16章完整版百度云盘
  7. cad线性标注命令_CAD的标注命令原来可以这样用,学了十几年,终于知道了
  8. 项目风险管理课程学习
  9. oracle的一些常见问题及处理
  10. linux查看消息队列的状态,linux – 如何知道某个时间点在消息队列中收到的消息数...