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. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践

    目录 系列文章 数据传输对象 输入DTO最佳实践 不要在输入DTO中定义不使用的属性 不要重用输入DTO 输入DTO中验证逻辑 输出DTO最佳实践 对象映射 学习帮助 系列文章 基于ABP落地领域驱动 ...

  2. 百炼 POJ2393:Yogurt factory【把存储费用用递推的方式表达】

    2393:Yogurt factory 总时间限制:  1000ms 内存限制:  65536kB 描述 The cows have purchased a yogurt factory that m ...

  3. 【进阶之路】深入理解Java虚拟机的类加载机制(长文)

    我们在参加面试的时候,经常被问到一些关于类加载机制的问题,也都会在面试之前准备的时候背好答案,但是我们是否有去深入了解什么是类加载机制呢?这段时间因为一些事情在家看了些书,这次就和大家分享一些关于Ja ...

  4. centos7安装kubernetes1.18.5

    一.设置hosts 修改主机名 [root@localhost kubernetes]# hostnamectl set-hostname master69 四台服务器安装kebernetes,一个m ...

  5. .net core 使用webservice

    开发环境在vs2017,2015 暂时没有试过 1.在扩展更新中添加Microsoft WCF Web Service Reference Provider 2.在core项目中添加链接的服务 3.键 ...

  6. 如何使用原生的Feign

    什么是Feign Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofi. JAXRS-2.0.WebSocket 等类库.通过 Fei ...

  7. Gym 101334J 找规律

    题意: 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 mo ...

  8. imply套件以及plyql的安装

    本文出自:http://www.cnblogs.com/gaojiang/p/7212149.html 1.安装nodejs,版本需要在4.0以上,安装方法见上篇博客 2.下载imply,地址:htt ...

  9. shell 调用其他shell脚本中的变量、函数

    在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一:   . ./subscript.sh  (两个点之间,有空格) 方法二:   source ./subscript. ...

  10. 通过ajax方式在界面上加载loading状态(仅作记录)

    1 html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, 2 pre, a, ab ...