• 监听虚拟键的切换
  • 给View添加全局的布局监听器
  • 参考链接

最近项目中遇到了华为虚拟按键适配的问题,主页是个RecylerView(如下图),如果不做适配,在界面初始化完毕后,虚拟按键会遮挡页面或者空出一些留白部分,针对这个问题上网找了些资料,总结了以下方法

首页下半部分是个RecylerView(针对适配)

监听虚拟键的切换

  • 注册系统广播
getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_is_min"), true, mNavigationStatusObserver);
private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {@Overridepublic void onChange(boolean selfChange) {int navigationBarIsMin = Settings.System.getInt(getContentResolver(),"navigationbar_is_min", 0);if (navigationBarIsMin == 1) {//导航键隐藏了Log.e("导航键隐藏了", "-----");gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);} else {//导航键显示了Log.e("导航键显示了", "-----");gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);}}};

给View添加全局的布局监听器

可以看到当虚拟按键切换的时候我会调用view的getViewTreeObserver().addOnGlobalLayoutListener给view设置全局的布局监听器,用于获取当前view可显示的实际高度,然后根据高度动态设置子item的高度

  • 布局监听器的回调
    在回调中测量RecylerView可显示的实际高度
 @Overridepublic void onGlobalLayout() {refreshGridViewHeight();}

注意这个回调是会调用多次的,获取完高度后要移除这个监听,否则会造成界面卡顿

 private void refreshGridViewHeight() {gridView_Home.post(new Runnable() {@Overridepublic void run() {//获取到宽度和高度后,可用于计算int height = gridView_Home.getHeight();//根据屏幕高度计算单个菜单的高度,保证屏幕能被填满final int itemHeight = height / 3 - 3;runOnUiThread(new Runnable() {@Overridepublic void run() {homeMenuAdapter.setIemtHeight(itemHeight);gridView_Home.setAdapter(homeMenuAdapter);mPresenter.refushGridData();if (Build.VERSION.SDK_INT < 16) {gridView_Home.getViewTreeObserver().removeGlobalOnLayoutListener(HomeActivity.this);} else {gridView_Home.getViewTreeObserver().removeOnGlobalLayoutListener(HomeActivity.this);}}});}});

这个移除布局监听的方法还要兼容低版本,所以要分情况,具体看代码

  • 最后记得在Activity的onDestroy或界面销毁的地方注销刚才设置的系统广播接收者
    getContentResolver().unregisterContentObserver(mNavigationStatusObserver);

参考链接

  • 华为(HuaWei)虚拟按键的判断和监听

  • Android适配底部返回键等虚拟键盘的完美解决方案

Android 虚拟按键适配动态调整布局相关推荐

  1. 安卓开发 监听虚拟按键_Android 虚拟按键适配动态调整布局的方法

    最近项目中遇到了华为虚拟按键适配的问题,主页是个RecylerView(如下图),如果不做适配,在界面初始化完毕后,虚拟按键会遮挡页面或者空出一些留白部分,针对这个问题上网找了些资料,总结了以下方法 ...

  2. 关于Android全面屏与虚拟按键适配问题

    随着手机不断更新换代,从物理按键到虚拟按键到全面屏都需要去适配. 1. 最简单的虚拟按键适配: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES. ...

  3. android按钮被遮住,解决Android 虚拟按键遮住了页面内容的问题

    在启动页的时候华为手机虚拟按键遮挡住了启动页下面的字找了找解决办法,特地记录一下 第一种办法:扩展虚拟按键 //状态栏 @ 顶部getWindow().addFlags(WindowManager.L ...

  4. android 虚拟按键源码流程分析

    android 虚拟按键流程分析 今天来说说android 的虚拟按键的源码流程.大家都知道,android 系统的状态栏,虚拟按键,下拉菜单,以及通知显示,keyguard 锁屏都是在framewo ...

  5. android 覆盖虚拟按键,解决Android 虚拟按键遮住了页面内容的问题

    在启动页的时候华为手机虚拟按键遮挡住了启动页下面的字找了找解决办法,特地记录一下 第一种办法:扩展虚拟按键 //状态栏 @ 顶部getWindow().addFlags(WindowManager.L ...

  6. uniapp中隐藏Android虚拟按键

    前言: uniapp中如何隐藏Android虚拟按键 (如下图) 解决: 通过h5-plus中的方法,plusready 后调用 https://www.html5plus.org/doc/zh_cn ...

  7. Android 虚拟按键隐藏或显示之后共享元素动画异常解决方案

    背景 本篇算是共享元素的第三篇文章.主要还是因为第一篇才会衍生出来了第二篇和第三篇文章,后两篇均属于bug的分析和解决. 1.Android 仿微信朋友圈图片拖拽返回 2.Android 共享元素动画 ...

  8. Android 虚拟按键与沉浸式的适配

    根据公司产品的要求,app要实现全屏模式,也就是4.4以后的所谓的沉浸式. 在values-v19和values-v21的styles里添加以下代码,实现19以上的系统的沉浸式: <style ...

  9. android 虚拟按键自定义,如何适配Android底部虚拟按键

    前言 本文章只做一个记录,一个备忘,也为了更好的帮助他人,文章参考地址:Android适配底部虚拟按键的方法 问题说明 项目进行中需要透明渐变的状态栏,全屏显示,当然透明渐变好弄,方法有很多,但是如果 ...

最新文章

  1. 利用Flutter写一个跨平台的果核APP(4)——数据存储
  2. 转载:分享一下免费的ppt网站(好看,免费)
  3. 2019牛客多校一 D. Parity of Tuples
  4. Linux驱动编程 step-by-step (十) Linux 内核链表
  5. Cannot resolve corresponding JNI function
  6. ubuntu下idea后台执行的方法
  7. 第八章Jdk代理 cglib代理
  8. 动画:什么是散列表?
  9. SPSS中K均值聚类操作案例
  10. laravel框架中hasOne和blongTo的用法详解
  11. 普乐蛙4d5d动感影院|VR太空旅行设备|VR带你遨游太空
  12. SignalR 循序渐进
  13. 《excel应用大全》(excel home 编著)--学习摘抄笔记2
  14. 利用BrainTree自定义UI绑定信用卡及Paypal
  15. 物联网卡无法激活使用的原因
  16. 电商运营之业务数据报告
  17. 修改linux xorg端口,Xorg服务开启tcp/ip监听,允许其它机器客户端连接
  18. eclipes error
  19. 软件体系结构的基本概念与作用
  20. Java 生成随机长度字母组合

热门文章

  1. 异常:non-compatible bean definition of same name and class【com.xxx.xxx.XXX】
  2. 计算机如何设置光驱启动,电脑怎样设置光驱启动系统
  3. 如何制作一个音游鬼畜视频
  4. 分散硬质聚氨酯(PUR)和聚异氰脲酯(PIR)泡沫保温材料英国UKCA认证— EN 14319-1
  5. Worthington木瓜蛋白酶化学性质和特异性
  6. 关于SIM卡的STK应用
  7. java中double..compare_Java Double类compare()方法与示例
  8. 30岁开始学python和liunx_学习python了,看完这篇文章,你的Linux基础就差不多了
  9. 二次元看过来!基于 Serverless 的舞萌音游查分器
  10. 关于React父子组件间的通信