Android 虚拟按键适配动态调整布局的方法
作者:i_SamHuang 时间:2022-03-03 07:20:24
最近项目中遇到了华为虚拟按键适配的问题,主页是个RecylerView(如下图),如果不做适配,在界面初始化完毕后,虚拟按键会遮挡页面或者空出一些留白部分,针对这个问题上网找了些资料,总结了以下方法
首页下部分是RecylerView
首页下半部分是个RecylerView(针对适配)
监听虚拟键的切换
注册系统广播
getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_is_min"), true, mNavigationStatusObserver);
private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {
@Override
public 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可显示的实际高度
@Override
public void onGlobalLayout() {
refreshGridViewHeight();
}
注意这个回调是会调用多次的,获取完高度后要移除这个监听,否则会造成界面卡顿
private void refreshGridViewHeight() {
gridView_Home.post(new Runnable() {
@Override
public void run() {
//获取到宽度和高度后,可用于计算
int height = gridView_Home.getHeight();
//根据屏幕高度计算单个菜单的高度,保证屏幕能被填满
final int itemHeight = height / 3 - 3;
runOnUiThread(new Runnable() {
@Override
public 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);
来源:https://blog.csdn.net/sam0750/article/details/73478214
标签:Android,虚拟,按键
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C语言运算符优先级列表(超详细)
2023-07-04 08:17:54
解决IDEA鼠标点击光标变大问题
2022-12-07 11:52:37
![](https://img.aspxhome.com/file/2023/4/79964_0s.jpg)
Java中File文件操作类的基础用法
2022-09-28 14:37:03
![](https://img.aspxhome.com/file/2023/2/78922_0s.png)
详解java Collections.sort的两种用法
2023-11-28 09:30:31
![](https://img.aspxhome.com/file/2023/3/60473_0s.png)
Java四种权限修饰符知识点详解
2023-11-11 06:12:59
深入讲解我们说的CAS自旋锁到底是什么
2022-05-21 14:43:08
Java语言实现简单FTP软件 FTP协议分析(1)
2023-11-10 17:57:21
![](https://img.aspxhome.com/file/2023/7/59027_0s.jpg)
java 中使用匿名类直接new接口详解及实例代码
2021-08-13 22:26:12
SpringBoot中的Aop用法示例详解
2023-03-31 14:12:00
![](https://img.aspxhome.com/file/2023/6/62986_0s.png)
Spring源码解密之自定义标签与解析
2023-11-25 01:11:34
![](https://img.aspxhome.com/file/2023/2/60112_0s.png)
Spark网站日志过滤分析实例讲解
2021-06-08 12:59:24
![](https://img.aspxhome.com/file/2023/7/60927_0s.png)
Mybatis 动态SQL的几种实现方法
2023-11-10 12:15:15
Java多线程模拟银行系统存钱问题详解
2023-11-28 22:13:32
![](https://img.aspxhome.com/file/2023/4/60254_0s.jpg)
Java数据结构之队列(动力节点Java学院整理)
2021-09-22 04:58:19
![](https://img.aspxhome.com/file/2023/6/65746_0s.png)
SpringBoot+JPA 分页查询指定列并返回指定实体方式
2021-08-26 11:54:57
Java Document生成和解析XML操作
2021-11-10 13:17:46
![](https://img.aspxhome.com/file/2023/0/66990_0s.jpg)
使用Spring boot + jQuery上传文件(kotlin)功能实例详解
2022-09-03 14:12:21
![](https://img.aspxhome.com/file/2023/3/77963_0s.png)
OpenCV实现反阈值二值化
2022-06-29 16:02:33
![](https://img.aspxhome.com/file/2023/6/76316_0s.jpg)
C# winform 请求http的实现(get,post)
2023-03-20 13:52:01
一文带你全面了解Java Hashtable
2021-09-19 01:39:39
![](https://img.aspxhome.com/file/2023/1/70971_0s.png)