在app开发中有很多项目使用底部tab+ ViewPager + fragment 的框架,那么这个时候如果app安装在底部带有虚拟键的设备上的话,会产生设备底部的虚拟键遮挡app底部tab的情况,这个时候对app的外观和功能的使用都产生了很大的影响,下边我们对此情况进行适配。

1、首先我们进行工具类的封装,主要思路是addOnGlobalLayoutListener全局监听视图的变化(onGlobalLayoutListener是viewTreeObserver的内部类,当视图变化时onGlobalLayoutListener可以监听到),那么当视图的高度发生变化时,就对这个视图重新布局,使视图不被遮挡。

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;import java.lang.reflect.Method;public class NavigationBarUtil {public static void initActivity(View content) {new NavigationBarUtil(content);}private View mObserved;//被监听的视图private int usableHeightView;//视图变化前的可用高度private ViewGroup.LayoutParams layoutParams;private NavigationBarUtil(View content) {mObserved = content;//给View添加全局的布局监听器监听视图的变化mObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {public void onGlobalLayout() {resetViewHeight();}});layoutParams = mObserved.getLayoutParams();}/*** 重置视图的高度,使不被底部虚拟键遮挡*/private void resetViewHeight() {int usableHeightViewNow = CalculateAvailableHeight();//比较布局变化前后的View的可用高度if (usableHeightViewNow != usableHeightView) {//如果两次高度不一致//将当前的View的可用高度设置成View的实际高度layoutParams.height = usableHeightViewNow;mObserved.requestLayout();//请求重新布局usableHeightView = usableHeightViewNow;}}/*** 计算试图高度* @return*/private int CalculateAvailableHeight() {Rect r = new Rect();mObserved.getWindowVisibleDisplayFrame(r);return (r.bottom - r.top);//如果不是沉浸状态栏,需要减去顶部高度
//        return (r.bottom );//如果是沉浸状态栏}/*** 判断底部是否有虚拟键* @param context* @return*/public static boolean hasNavigationBar(Context context) {boolean hasNavigationBar = false;Resources rs = context.getResources();int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");if (id > 0) {hasNavigationBar = rs.getBoolean(id);}try {Class systemPropertiesClass = Class.forName("android.os.SystemProperties");Method m = systemPropertiesClass.getMethod("get", String.class);String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");if ("1".equals(navBarOverride)) {hasNavigationBar = false;} else if ("0".equals(navBarOverride)) {hasNavigationBar = true;}} catch (Exception e) {}return hasNavigationBar;}}

2、在需要适配的activity 的 onCreate方法中的 super.onCreate(savedInstanceState)之后 调用

  if(NavigationBarUtil.hasNavigationBar(this)){NavigationBarUtil.initActivity(findViewById(android.R.id.content));}

(推荐封装base 这样就可以直接继承base就可以)。

最后的效果就是app底部tab 在设备的虚拟键之上。

适配Android 华为等底部虚拟键相关推荐

  1. android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏

    19版本以上Android可以自己实现沉浸式状态栏的设置 1.创建values-v21文件夹(为了匹配低版本) 在style文件中设置: 设置了这两个属性状态栏就能设置为透明的.但是需要注意的是,这个 ...

  2. android自动隐藏虚拟键,Android 隐藏底部虚拟键的两种方法

    方法一  滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 1 ...

  3. android+4.4.2+隐藏虚拟按钮,Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法...

    //去title requestWindowFeature(Window.FEATURE_NO_TITLE); //隐藏状态栏 getWindow().setFlags(WindowManager.L ...

  4. android 隐藏手机底部虚拟按键

    今天,简单讲讲android如何隐藏手机下面的虚拟按键. 其实,自己在做界面适配时,老是发现了华为手机存在适配的问题,主要就是华为手机有一个底部的虚拟按键占用了界面的部分空间,所以在网上搜索了如何隐藏 ...

  5. Android如何隐藏底部虚拟按键

    虚拟按键隐藏 相信大家在做屏幕适配时候,会对虚拟按键问题或多或少有一些疑问,接下来带给大家解决虚拟按键的方法. android隐藏底部虚拟键Navigation Bar实现全屏 安卓4.1之后为全虚拟 ...

  6. 【Android】隐藏底部虚拟按键,亲测可用

    Google的官方文档是: https://developer.android.com/training/system-ui/navigation.html#behind 示例代码 View deco ...

  7. 【Android】隐藏底部虚拟按键

    Google的官方文档是: https://developer.android.com/training/system-ui/navigation.html#behind 示例代码 1 View de ...

  8. android 隐藏导航栏 虚拟键

    感谢作者:https://juejin.im/post/5d5ce681e51d45620821cec6 1.首先设置全屏显示 2.然后全屏并隐藏虚拟导航栏.设置导航栏状态监听,避免点击一下后导航栏又 ...

  9. java 隐藏虚拟键_Android 对底部虚拟键的显示和隐藏

    场景:播放全屏视频或则游戏界面会隐藏虚拟按键,其他界面会显示虚拟按键. 1.隐藏底部虚拟按钮: /** * 隐藏虚拟按键 */ public void goneSystemUi(){ //隐藏虚拟按键 ...

最新文章

  1. 【算法】Tween算法
  2. 基于OpencvTensorflow实现实时查找停车位置
  3. 2019年Vue学习路线图
  4. Bash数组操作教程
  5. mysql 唯一约束 多字段_mysql多字段唯一约束
  6. Nacos集群部署说明
  7. sql int 比较_分享 21 个编写 SQL 的好习惯
  8. Android开发笔记(一百一十)使用http框架上传文件
  9. 开源如何走向商业化?
  10. OpenCV读取一张图片,并将其转换为灰度图像显示
  11. APS计划排程和生产排产系统,包含哪些排程算法?
  12. python爬虫 - 爬取堆糖图片
  13. java虚拟机扫盲文
  14. 基于LMS算法的DFE判决反馈均衡器
  15. Python爬虫:使用线程池快速下载视频
  16. android按住录音按钮_Android模仿微信录音、发送语音效果实现
  17. EndnoteX9下载及教程
  18. 小米 红米版note 4x刷机成功
  19. sql语句中where 1=1的作用
  20. java vector的排序_java Vector排序及用法

热门文章

  1. CCF-CSP认证试题——分蛋糕
  2. 信息安全管理与评估知识概括
  3. pandapower教程——直流潮流计算
  4. 工作后感悟《大话西游》
  5. 【PTA Advanced】1148 Werewolf - Simple Version(C++)
  6. 中国引流海绵行业市场供需与战略研究报告
  7. 互联网技术研发管理之激励提升
  8. 在CentOS中开启mysql服务
  9. Ubuntu20.04系统使用笔记
  10. 微信小程序(触控事件)