http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0731/1640.html

本篇博客是http://www.cnblogs.com/longjunhao/p/8973729.html的后续

问题:上篇博客中,如果在onCreate中就需要获取statusbar的高度,当kill进程之后再次进入oncreate时,由于新增的statusBarHelperView还没有绘制完成导致statusbar获取失败。

解决方案:

方案1:在onCreate中调用statusbar时,做个延迟操作。但是这种方案不太好,毕竟是如果手机比较卡的时候可能也会失败

方案2:给statusHelperView增加绘制完的监听:mStatusBarHelperView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);当绘制完成后会调用该监听中的onGlobalLayout方法,然后再通过回调,当执行onGlobalLayout时再获取statusbar的高度,在上面博客中的工具类中新增如下方法:

package com.smartisanos.ime.util;

import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.WindowManager; import com.smartisanos.ime.IMEApp; public class StatusBarHelper {
private Context mContext;
private View mStatusBarHelperView;
private static StatusBarHelper mStatusBarHelper = new StatusBarHelper();
private static final int MSG_INIT_STATUS_BAR = 1;
private static final int MSG_REMOVE_STATUS_BAR = 2;
private static final long MSG_REMOVE_DELAY_TIME = 500L; private StatusBarHelperViewLayoutListener mStatusBarHelperViewLayoutListener; private Handler mStatusBarHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_INIT_STATUS_BAR:
mStatusBarHandler.removeMessages(MSG_REMOVE_STATUS_BAR);
initStatusBarHelperView();
break;
case MSG_REMOVE_STATUS_BAR:
removeStatusBarView();
break;
}
}
}; private StatusBarHelper() {
mContext = IMEApp.getContext();
} public static StatusBarHelper getInstance() {
return mStatusBarHelper;
} private void initStatusBarHelperView() {
if (mStatusBarHelperView != null) {
return;
}
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mStatusBarHelperView = new View(mContext);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
lp.gravity = Gravity.LEFT | Gravity.TOP;
lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
lp.format = PixelFormat.TRANSLUCENT;
mStatusBarHelperView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);
wm.addView(mStatusBarHelperView, lp);
} public void addStatusBarHelperView() {
Message message = mStatusBarHandler.obtainMessage(StatusBarHelper.MSG_INIT_STATUS_BAR);
mStatusBarHandler.sendMessage(message);
} public void removeStatusBarHelperView() {
Message message = mStatusBarHandler.obtainMessage(StatusBarHelper.MSG_REMOVE_STATUS_BAR);
mStatusBarHandler.sendMessageDelayed(message, StatusBarHelper.MSG_REMOVE_DELAY_TIME);
} public int getStatusBarHeight() {
if (mStatusBarHelperView == null) {
return 0;
}
int[] windowParams = new int[2];
int[] screenParams = new int[2];
mStatusBarHelperView.getLocationInWindow(windowParams);
mStatusBarHelperView.getLocationOnScreen(screenParams);
return screenParams[1] - windowParams[1];
} private void removeStatusBarView() {
if (mStatusBarHelperView != null) {
mStatusBarHelperView.getViewTreeObserver().removeOnGlobalLayoutListener(mGlobalLayoutListener);
WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
wm.removeView(mStatusBarHelperView);
mStatusBarHelperView = null;
}
} private ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mStatusBarHelperViewLayoutListener != null) {
mStatusBarHelperViewLayoutListener.updateStatusBarHeightWhenGlobalLayout();
}
}
}; public interface StatusBarHelperViewLayoutListener {
void updateStatusBarHeightWhenGlobalLayout();
} public void setStatusBarHelperViewLayoutListener(StatusBarHelperViewLayoutListener listener) {
mStatusBarHelperViewLayoutListener = listener;
} public void onConfigurationChanged() {//此处和本博客无关
removeStatusBarView();
initStatusBarHelperView();
}
}

这样在onCreate中调用的时候,只需要回调方法即可:

        StatusBarHelper.getInstance().setStatusBarHelperViewLayoutListener(new StatusBarHelper.StatusBarHelperViewLayoutListener() {
@Override
public void updateStatusBarHeightWhenGlobalLayout() {
if (mStatusBarHeight != IMEContext.config().getStatusBarHeight() && isShowing()) {
mStatusBarHeight = IMEContext.config().getStatusBarHeight();
//当helpeView绘制完成之后,判断mStatusBarHeight(此全局变量是onCreate中获取的)和新的不相等后,执行相应的操作(eg:update操作)
}
}
});

判断状态栏是否显示以及获取状态栏高度的方法,及工具类列子【续:及OnGlobalLayoutListener的利用】的更多相关文章

  1. JS获取div高度的方法

    有时在写页面时,需要获取一个div的高度.怎么才能获取呢?哈哈,先上结论.有两种方法. offsetHeight .clientHeight getComputedStyle offsetHeight ...

  2. 在spring中获取代理对象代理的目标对象工具类

    昨天晚上一哥们需要获取代理对象的目标对象,查找了文档发现没有相应的工具类,因此自己写了一个分享给大家.能获取JDK动态代理/CGLIB代理对象代理的目标对象. 问题描述:: 我现在遇到个棘手的问题,要 ...

  3. 可以获取JVM信息的一些管理工具类

    一些可以获取JVM信息的java工具类 BufferPoolMXBean.class ClassLoadingMXBean.class CompilationMXBean.class GarbageC ...

  4. 获取JVM转储文件的Java工具类

    在上期文章如何获取JVM堆转储文件中,介绍了几种方法获取JVM的转储文件,其中编程方法是里面唯一一个从JVM内部获取的方法.这里就不演示了其他方法获取正在运行的应用程序的堆转储,重点放在了使用编程来获 ...

  5. js中获取窗口高度的方法

    取窗口滚动条滚动高度 function getScrollTop() { var scrollTop=0; if(document.documentElement&&document. ...

  6. ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)(转载)

    背景: ios5之前,iphone上的键盘的高度是固定为216.0px高的,中文汉字的选择框是悬浮的,所以不少应用都将此高度来标注键盘的高度(包括米聊也是这么做的). 可是在ios5中,键盘布局变了, ...

  7. 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍

    java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...

  8. 数据库表中MAX ID获取,确保每次调用没有重复工具类(NumberUtil)

    下面这个类是获取数据库中一个字段的最大值.配置在数据库中. public class NoFactory { private final static Logger cLogger = Logger. ...

  9. java根据身份证号和获取用户年龄和性别的工具类

    import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util ...

随机推荐

  1. 在 raspberry pi pico 上体验 MicroPython

    raspberry pi pico 官方提供 2 种开发方式,其中一种是使用 python3 开发,树莓派提供了 MicroPython 固件,把这个固件烧录进去,就可以 在 pico 上跑 pyth ...

  2. 从零实操基于WSL2 Docker部署Asp.Net Core项目

    前言 平日在公司里都是基于阿里Teambition中的飞流进行Docker部署Api项目或服务,已经习惯了那一套成熟的操作流程,开发和部署确实快捷方便,但是还没在自己的电脑上进行操作过,特别是Wind ...

  3. 中文NER的那些事儿3. SoftLexicon等词汇增强详解&代码实现

    前两章我们分别介绍了NER的基线模型Bert-Bilstm-crf, 以及多任务和对抗学习在解决词边界和跨领域迁移的解决方案.这一章我们就词汇增强这个中文NER的核心问题之一来看看都有哪些解决方案.以 ...

  4. 【Linux】通过shell脚本对mysql的增删改查以及my.cnf的配置

    目录 shell操作mysql 1.获取mysql默认密码 2.修改my.cnf文件 3.shell创建mysql数据库 4.shell创建mysql表 5.shell添加数据 6.shell删除数据 ...

  5. FastDFS文件系统迁移和数据恢复

    迁移步骤 打包旧服务器文件的所有文件 定位到旧服务器的tracker和Storage目录,将整个文件夹打包 tar -zcf fdfs-storage-data.tar.gz /fastdfs/sto ...

  6. Mysql 主键的操作

    ​ 主键:primary key ,主要的键.一张表只能有一个字段可以使用对应的键,用来唯一的约束字段里面的数据,数据不能重复,这种键称之为主键,一张表只能最多有一个主键.  一.增加主键 方法一:在 ...

  7. Linux(CentOS)下安装docker

    Linux(CentOS)安装Docker 查看当前内核版本 [docker@localhost ~]$ uname -r 确保yum包更新到最新 [docker@localhost ~]$ sudo ...

  8. shell 中的for循环

    第一类:数字性循环 #!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done #!/bin/bash for i i ...

  9. 线程中的join()

    http://blog.itpub.net/31555134/viewspace-2221319/ 一直对join()方法不是很理解,在A线程中, B线程调用了join()方法,然后在内部实际是wai ...

  10. XCTF re-100

    一.无壳并拉入ida64静态调试(注释说的很明白了) 二.confuseKey是个关键函数,进入看看 发现就是将我们所输入的字符串分割,并把顺序调换了,调回来就是我们的flag. 三.flag: 提交 ...