背景介绍:

到目前为止,android已经从1.5发展到目前的3.2,我们在写一个应用的时候,最常用到得就是获取屏幕高度,宽度,以及status bar的高度。

然而android系统变化太快了,从开始的手机操作系统到目前的3.2 平板电脑系统,在获取这些数据的时候也发生了很大的变化。

值得我们重视,否则会有很多错误发生。

问题分析及解决方案:

1. android 1.6 到 android 2.x

这是android手机操作系统,从1.6到2.x都有着统一的获取方法。

直接利用android api即可获取相关的尺寸:

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);

int width = wm.getDefaultDisplay().getWidth();//屏幕宽度

int height = wm.getDefaultDisplay().getHeight();//屏幕高度

Rect rect= new Rect();

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

int statusBarHeight = rect.top; //状态栏高度

2. android 3.0 平板系统

在3.0系统中,status bar在屏幕下方,因为计算方法也发生改变。

在3.0系统中获取屏幕高度和宽度的方法没有改变。

状态的获取方法如下:

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

int statusBarHeight = window.getWindowManager().getDefaultDisplay().getHeight() - rect.bottom;

即利用屏幕高度减去显示区域的最大高度即为下方status bar的高度

3. android 3.2平板系统

在android 3.2中就有了很大的改变,当我们调用getWidth()和getheight()获取宽度和高度的时候,不会返回屏幕的真实尺寸,

而是只返回屏幕的显示区域的尺寸,即减去了状态栏的高度。

运用这两个api函数读取的尺寸肯定不是我们想要的结果。

这时我们发现其提供了两个隐藏函数getRealHeight()和getRealWidth()用来获取真实的屏幕尺寸。

一因为是隐藏函数,所以我们只能通过反射来调用这两个函数,但这样带来不好的就是反射效率实在是太差了。

Display display = wm.getDefaultDisplay();

Class c = Class.forName("android.view.Display");

Method method = c.getMethod("getRealHeight");

int height = (Integer) method.invoke(display);

Rect rect= new Rect();

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

statusbarHeight = height - rect.bottom;

对上述代码进行优化,如果当我们频繁调用的时候,必将影响程序性能。

我们可以保存第一次反射的相关信息,然后在后面直接调用。

private Method method = null;// 用来保存method对象

---------------------------------------------------------------------------------

Display display = wm.getDefaultDisplay();

//判断method是否为空,如果为null,则利用反射得到method信息,否则,利用旧的method对象。

if(method == null)

{

method = display.getClass().getMethod("getRealHeight"); //这里直接用display的class信息

}

int height = (Integer) method.invoke(display);

Rect rect= new Rect();

this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

经试验Android4.0以上平台也依然可以用最上面的方法获取状态栏高度

Android获取屏幕高度、标题高度、状态栏高度详解

Android获取屏幕高度的方法主要由view提供 通过View提供的方法获取高度方式有两种: 1, 当前显示的view中直接获取当前view高宽2,通过Activity的getWindow().fi ...

获取Android 手机屏幕宽度和高度以及获取Android手机序列号

1.获取Android 手机屏幕宽度 1 DisplayMetrics dm = new DisplayMetrics(); 2 this.getWindowManager().getDefaultD ...

js获取屏幕高度宽度

获取各种屏幕的宽度和高度Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽 ...

android 获取屏幕高度和宽度 的方法

我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现.下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即可获取屏幕的尺寸.    在一个Activity的onC ...

android: 获取屏幕高度和虚拟导航栏高度的几种方法

package com.yongdaimi.android.androidapitest; import android.app.Activity; import android.content.Co ...

Android开发之获取状态栏高度、屏幕的宽和高

转自:http://blog.csdn.net/guolin_blog/article/details/16919859 获取状态栏的高度. private static int statusBarH ...

android 获得屏幕宽度和高度

js和jQuery 获取屏幕高度、宽度

js获取屏幕高度,宽带 网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body ...

android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度

android获取自己定义控件位置坐标,屏幕尺寸,标题栏,状态栏高度 1.获取自己定义控件height 在本Activity中获取当前Activity中控件的height: Button button ...

随机推荐

WCF学习之旅—WCF寄宿前的准备(八)

一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类协定的定 ...

Zero-Copy&sendfile浅析

一.典型IO调用的问题一个典型的web服务器传送静态文件(如CSS,JS,图片等)的过程如下:read(file, tmp_buf, len);write(socket, tmp_buf, len); ...

查看浏览记录(thinkphp)

if ((MODULE_NAME == 'Goods' || MODULE_NAME == 'News') && ACTION_NAME == 'info' && $t ...

Android下的Linux指令集

Android目录结构 data app:用户安装的应用 data:应用的专属文件夹 system:系统的配置信息,注册表文件 anr:anr异常的记录信息 dev:devices的缩写 存放设备所对 ...

Z-Stack协议中几个重要概念的理解

1. 原语     ZigBee设备在工作时,各种不同的任务在不同的层次上执行,通过层的服务,完成所要执行的任务.每一层的服务主要完成两种功能:根据它的下层服务要求,为上层提供相应的服务:另一咱是根据 ...

根据树父子ID拼接无限极树结构表的名称

declare @c varchar(50)set @c='572a3d51-ef7a-459e-a5cd-ebf0fca51e8b' --能查出来呀 你试试,我试一下,好像可以啦谢谢 declare ...

带你一起Piu Piu Piu~

单刀直入,今天要讲的是自己写的一个WPF动画例子.我们在看下最终效果~ 最近在重看WPF编程宝典2010,在练习第15章动画性能例子时有了些想法.原始例子如下:  原始例子(打包了整个15章的) 它是 ...

IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统

原文:IIS服务器 远程发布(Web Deploy)配置 VS2010 开发环境 Windows Server 2008服务器系统 asp.net 网站有三种常用的发布方式:分别是拷贝开发机上发布好的 ...

下拉刷新和上拉加载 Swift

转载自:http://iyiming.me/blog/2015/07/05/custom-refresh-and-loading/ 关于下拉刷新和上拉加载,项目中一直使用MJRefresh(原先还用过 ...

“百度杯”CTF比赛 九月场_123(文件备份,爆破,上传)

题目在i春秋ctf训练营 翻看源码,发现提示: 打开user.php,页面一片空白,参考大佬的博客才知道可能会存在user.php.bak的备份文件,下载该文件可以得到用户名列表 拿去burp爆破: ...

android获取手机状态栏高度,Android 获取屏幕高度,宽度,状态栏高度相关推荐

  1. android获取手机a标签,Android获得手机UserAgent的源码

    就在我们使用安卓手机接通Pc的时候,或者使用的有些app比如我们企业营销团队就在使用的app引号精灵,以前老版本就需要开启USB开发者调试模式下使用,现就在新版本不需要了,如果手机没有开启USB开发者 ...

  2. android获取手机资源文件,android MediaStore 读取手机文件

    背景:项目需求,聊天界面需要发送文件.所以,仿qq开发文件组件,以供所有项目使用 目标:记录组件开发中的一次技术积累,与大家分享 前言: 大家可以打开qq,聊天界面底部九宫格中有"文件&qu ...

  3. android 获取手机颜色代码,Android获取当前主题的颜色属性

    安卓代码中获取当前主题颜色方法的两种方法: 第一种方法: TypedArray array = getTheme().obtainStyledAttributes(new int[]{ android ...

  4. android获取操作系统版本号,Android 获取手机的厂商、型号、Android系统版本号、IMEI、当前系统语言等工具类...

    1.获取手机制造厂商 2.获取手机型号 3.获取手机系统当前使用的语言 4.获取Android系统版本号 5.获取手机IMEI串号 6.获取手机中的语言列表 SystemUtil类 1. /** 2. ...

  5. android 6.0获取手机imei,android获取手机信息大全,android获取大全,IMEI号,IESI号,...

    android获取手机信息大全,android获取大全,IMEI号,IESI号, IMEI号,IESI号,手机型号: [java] view plaincopyprint?private void g ...

  6. 【小功能2】android获取手机信息(号码,内存,CPU,分辨率,MAC,IP,SD卡,IMEI,经纬度,信号强度等等)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://2402766.blog.51cto.com/2392766/1080837 为了 ...

  7. Qt for Android获取手机序列号/手机型号/手机制造商

    前言 Qt for Android 获取手机型号/手机制造商/手机序列号,这些是要通过 Android 原生接口才能获取到的, 那么在 Qt 项目中通过 jni 接口调用 Android 原生接口来获 ...

  8. android 获取手机运行的进程

    今天,简单讲讲如何获取系统运行的进程. ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序 每一个应用程序都会运行在它独立的进程里,但是为了节省资源或 ...

  9. android获取手机机型、厂商、deviceID基本信息

    /*** 系统工具类*/ public class SystemUtil {/*** 获取当前手机系统语言.** @return 返回当前系统语言.例如:当前设置的是"中文-中国" ...

  10. android 获取已安装 错误代码,android获取手机已经安装的app信息

    Android获取手机已安装APP(系统/非系统) 效果图 主体代码 private ListView mlistview; private ListpackageInfoList; private ...

最新文章

  1. 在ASP.NET中将图片存储到Sql Server数据库中
  2. Oracle数据库对象----视图
  3. 主机到中继地址的发包路径
  4. 【-】WebKit Layout (布局)
  5. 基于RBGD的mapping
  6. 【Codeforces - 864D】Make a Permutation!(贪心,字典序)
  7. 天池 在线编程 区间合并(字符串)
  8. 正面管教php_佛山市第三中学正面管教家长工作坊PHP分享会
  9. 回转体怎么划分六面体网格_一文了解ANSYS Meshing 高级网格划分技术
  10. c++ 清除list占用的内存_pytorch内存泄露-dataloader
  11. java ZipEntry 压缩 解压缩 在linux下中文乱码问题解决
  12. Adobe dreamweaver CS6小白入门教程
  13. 影视搜索播放PHP源码_可对接资源网
  14. excel宏设置之一键生成多张sheet并写入内容与格式
  15. 浏览器无法访问此网站该如何处理?
  16. android 魅族定位权限,魅族Flyme5.2的权限问题
  17. android手机联调,Android第三课 联调华为手机
  18. 下列哪个不是python的第三方库_以下选项中,不是 Python 中用于开发用户界面的第三方库是()...
  19. Linux网络编程基础3:数据读写
  20. 模拟开关/多路复用器(CH442E)

热门文章

  1. SE 2.4.0 patch机器码笔记
  2. Windows Server AppFabric分布式缓存研究
  3. Flex Builder3编译时生成as
  4. 怎么查看计算机办公软件版本的,怎样查看电脑用的什么办公软件
  5. linux测试网络带宽 360,Linux版360浏览器提示此为beta测试版本,已超过测试时间3个月的处理...
  6. python爬取谷歌图片_Python爬取谷歌街景图片
  7. Ubuntu 18.04 安装 NVIDIA 显卡驱动超详细步骤
  8. CruiseControl.Net+SVN+MSBuild 自动编译
  9. Exchange2010重装注意事项
  10. 基于樽海鞘群算法的WSN节点的部署优化