设为首页收藏本站
查看: 1153|回复: 3

[Android综合讨论区] android 监听虚拟按键的显示与隐藏

[复制链接]
  • TA的每日心情
    慵懒
    7 天前
  • 签到天数: 75 天

    [LV.6]常住居民II

    发表于 2018-10-11 17:42:49 | 显示全部楼层 |阅读模式
    虽然不知道现在红盟中现在有多少做Android开发的 但是我还是想发点东西出来 在红盟论坛我会不定期同步本人博客中的东西过来 可能比较浅显 希望对大家有用


    在开发过程中 由于很多机型有有虚拟按键(这其中尤其是华为 本篇文章我是为了适配华为p20总结出来的方法) 需要我们做一些处理 有时候可能我们做了沉浸式处理 然后在应用在运行的时候 用户突然隐藏掉虚拟按键 导致应用下面一条空白的或者是黑色的 导致用户体验不好 这里就需要我们监听虚拟按键的状态 来改变布局
    首先 在需要监听虚拟按键的activity 实现ViewTreeObserver.OnGlobalLayoutListener
    比如:
    1. MainActivity implements  ViewTreeObserver.OnGlobalLayoutListener
    复制代码

    接下来 获取到activity最外层Layout
    1. RelativeLayout layout = findViewById(R.id.activity_layout );
    复制代码

    然后设置在onResume()给Layout设置OnGlobalLayoutListener onPause()注释OnGlobalLayoutListener
    这里解释一下:
    OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。
    由于OnGlobalLayoutListener可能会被多次触发,onPause()所以要在要将OnGlobalLayoutListener注销掉。
    1. @Override
    2.         protected void onResume() {
    3.         super.onResume();
    4.         layout .getViewTreeObserver().addOnGlobalLayoutListener(this);
    5.     }
    6.         @Override
    7.     protected void onPause() {
    8.         super.onPause();
    9.         layout .getViewTreeObserver().removeGlobalOnLayoutListener(this);
    10.     }
    复制代码


    然后加上一个获取虚拟按键是否显示的方法
    1. public boolean isNavigationBarShow(Activity activity){
    2.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    3.             Display display = activity.getWindowManager().getDefaultDisplay();
    4.             Point size = new Point();
    5.             Point realSize = new Point();
    6.             display.getSize(size);
    7.             display.getRealSize(realSize);
    8.             boolean  result  = realSize.y!=size.y;
    9.             return realSize.y!=size.y;
    10.         }else {
    11.             boolean menu = ViewConfiguration.get(activity).hasPermanentMenuKey();
    12.             boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
    13.             if(menu || back) {
    14.                 return false;
    15.             }else {
    16.                 return true;
    17.             }
    18.         }
    19.     }
    复制代码

    最后在onGlobalLayout()中调用isNavigationBarShow()并做判断
    1. @Override
    2.     public void onGlobalLayout() {
    3.         if (isNavigationBarShow(this)) {
    4. //    虚拟按键显示的时候的处理
    5.         }else {
    6. //            虚拟按键隐藏时的处理
    7.         }
    8.     }
    复制代码


  • TA的每日心情
    无聊
    2018-12-7 14:07
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    发表于 2018-10-12 08:00:29 来自手机 | 显示全部楼层
    有点懵懵懂懂的感觉,我手机没这玩意
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    5 天前
  • 签到天数: 148 天

    [LV.7]常住居民III

    发表于 2018-10-12 08:58:09 | 显示全部楼层
    正准备学完java框架,就往安卓走,看你这代码 不会觉得陌生,看来应该没多大问题转方向,感谢楼主
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-11-26 21:49
  • 签到天数: 112 天

    [LV.6]常住居民II

    发表于 2018-10-12 14:03:35 | 显示全部楼层
    先收藏再慢慢看
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    站长推荐 上一条 /1 下一条

    红盟社区--中国红客联盟 

    Processed in 0.105700 second(s), 16 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表