Android解决虚拟按键栏遮挡问题
龙旋
共 2794字,需浏览 6分钟
· 2021-03-20
最近在公司的项目中 , 华为用户反馈出了一个问题 , 华为手机底部有虚拟按键栏把应用的底部内容遮挡住了 , 现在已经把这个问题解决了 , 记录一下,给各位遇到相同问题的童鞋做一下参考.
这里的解决方案还是相对比较简单的,首先判断用户的手机是否存在虚拟按键,若存在,那么就获取虚拟按键的高度,然后再用代码设置相同高度的TextView,这样手机的虚拟按键就不会将底部的内容遮挡住了。
处理虚拟按键栏工具类:
public class ScreenUtils {
//获取虚拟按键的高度
public static int getNavigationBarHeight(Context context) {
int result = 0;
if (hasNavBar(context)) {
Resources res = context.getResources();
int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
result = res.getDimensionPixelSize(resourceId);
}
}
return result;
}
/**
* 检查是否存在虚拟按键栏
*
* @param context
* @return
*/
(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static boolean hasNavBar(Context context) {
Resources res = context.getResources();//读取系统资源函数
int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");//获取资源id
if (resourceId != 0) {
boolean hasNav = res.getBoolean(resourceId);
// check override flag
String sNavBarOverride = getNavBarOverride();
if ("1".equals(sNavBarOverride)) {
hasNav = false;
} else if ("0".equals(sNavBarOverride)) {
hasNav = true;
}
return hasNav;
} else { // fallback
return !ViewConfiguration.get(context).hasPermanentMenuKey();
}
}
/**
* 判断虚拟按键栏是否重写
* @return
*/
private static String getNavBarOverride() {
String sNavBarOverride = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
Class c = Class.forName("android.os.SystemProperties");
Method m = c.getDeclaredMethod("get", String.class);
m.setAccessible(true);
sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
} catch (Throwable e) {
}
}
return sNavBarOverride;
}
}
调用工具类方法 , 获取虚拟按键高度:
//处理虚拟按键
//判断用户手机机型是否有虚拟按键栏
if(ScreenUtils.hasNavBar(getApplicationContext())){
setNavigationBar();
}
//处理虚拟按键
private void setNavigationBar() {
int barHeight = ScreenUtils.getNavigationBarHeight(getApplicationContext());
LinearLayout.LayoutParams barParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
TextView tv = new TextView(this);
tv.setHeight(barHeight);
tv.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
tv.setBackgroundColor(Color.BLACK);
llNavigationBar.addView(tv,barParams);
}
到这里就结束啦!
评论
展讯平台手机重启问题分析指南
和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、 User 版本 默认开启 sysdump 方法二、插入SD卡 抓取Sysdump log三、 sysdump log 分析四、展讯平台抓取重启 串口log的方案五、展讯平台判断重启类型六、展讯平台关闭
程序员Android
0
字节面试:如何解决MQ消息积压问题?
面试题大全:www.javacn.siteMQ(Message Queue)消息积压问题指的是在消息队列中累积了大量未处理的消息,导致消息队列中的消息积压严重,超出系统处理能力,影响系统性能和稳定性的现象。1.消息积压是哪个环节的问题?MQ 执行有三大阶段:消息生产阶段。消息存储阶段。消息消费阶段。
Java中文社群
0
排名问题新解法:探索可视化计算中的 RANK 函数
上次我们介绍了可视化计算替代 DAX 计算的一些场景。参考:PowerBI 进阶:可视化计算替代 DAX 场景探索今天我们介绍一个新的场景,这是一个困扰许多人的问题,排名问题。在 DAX 中,很多新手小白对于上下文概念还不太理解,但在处理排名问题时又要求你必须理解一些上下文,比如常见的绝对排名和相对
PowerBI战友联盟
8
想都是问题,干就有答案,今天收获2个成绩
觉醒的拉新活动终于结束我以加入涛哥战队的方式去做的这次拉新活动最终排名是第4,没进前三虽然有遗憾,但还是从这个活动中学到了很多东西。为什么我要参与这个活动呢?参加这个拉新活动目的绝不是为了赚这个佣金,虽然我也能分到几千块,如果纯粹地为了赚这个佣金,其实是一个投入产出比极低的事情。最主要的还是奔着学习
python之禅
0
隐藏iPhone底部Dock栏壁纸,全机型适用!
一共分享了7张隐藏iPhone底部Dock栏壁纸,黑色需要打开深色模式识别下方二维码可以前去下载原图---------图片搜集自网络,仅作壁纸分享用途.如有侵犯您的权益,请联系我们删除.觉得不错的就点个“在看”吧
宅哥技术
0
为什么回归问题用 MSE?
作者:Matrix.小泽直树来源:https://zhuanlan.zhihu.com/p/463812174最近在看李沐的实用机器学习课程,讲到regression问题的loss的时候有弹幕问:“为什么要平方?”如果是几年前学生问我这个问题,我会回答:“因为做回归的时候的我们的残差
机器学习算法与Python实战
10
分库分表后,数据库数据一致性问题如何解决?
来源:juejin.cn/post/6933003178661462023前言数据迁移分布式事务总结前言通过对数据的垂直拆分或水平拆分后,我们解决了数据库容量、性能等问题,但是将会面临数据迁移和数据一致性的问题。在数据迁移方面,需要考虑如何快速迁移、平滑迁移、不停机的迁移等。待数据迁移完毕后,还需要
java金融
0
面试官:MQ 消息丢失、重复、积压问题,如何解决?
点击关注上方“Stephen”,设为“置顶或星标”,第一时间送达干货面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了MQ 技术(如 Kafka、RabbitMQ、RocketMQ),基本都会抛出一个问题:在使用 MQ 的时候,怎么确保消息 100% 不丢失?这个问题在实际工作中很常见,
Stephen
0