Android 虚拟按键适配动态调整布局的方法
作者:i_SamHuang 发布时间:2022-03-03 07:20:24
标签:Android,虚拟,按键
最近项目中遇到了华为虚拟按键适配的问题,主页是个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


猜你喜欢
- 前言本篇文章 中写到的是 flutter 调用了Android 原生的 TextView 案例添加原生组件的流程基本上可以描述为:1 and
- 上一节,简单讲述了 Mybatis-Plus 搭建与使用入门,这一节,简单讲一下如何使用 MP 实现多表分页。分析使用的工程,依旧是 spr
- C++对string进行大小写转换操作方法方法一:使用C语言之前的方法,使用函数,进行转换#include <iostream>
- 对于初学java的同学来说,第一件事不是写hello world,而是搭建好java开发环境,下载jdk,安装,配置环境变量。这些操作在xp
- 这篇文章主要介绍了Springboot如何设置静态资源缓存一年,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- Android开发,触控无处不在。对于一些 不咋看源码的同学来说,多少对这块都会有一些疑惑。View事件的分发机制,不仅在做业务需求中会碰到
- 理解hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
- 一、智能指针-唯一所有者boost::scoped_ptr 是一个智能指针,它是动态分配对象的唯一所有者。 boost::scoped_pt
- 绝大部分知识与实例来自O'REILLY的《Java网络编程》(Java Network Programming,Fourth Edi
- 最近在学习springboot,session这个点一直困扰了我好久,今天把这些天踩的坑分享出来吧,希望能帮助更多的人。一、pom.xml配
- 获取手机唯一标识 拼接的方式获取手机唯一标识第一种方式是获取IMEI,但是有的手机如果不是正品的话,就获取不到所以通过这一种方式还是会出现有
- 前言本文主要给大家介绍了关于Android在Gradle中更改APK文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细
- 方法一class Program { [STAThread] static
- 本文实例讲述了C#实现rar压缩与解压缩文件的方法。分享给大家供大家参考。具体分析如下:此程序利用 WinRAR 程序对文件进行压缩,命令行
- 前言 前一段时间得闲的时候优化了一下我之前的轮子[DotNetCoreRpc]小框架,其中主要
- final关键字的作用final关键字可以用来修饰引用、方法和类。1.final关键字修饰类当用final关键字修饰一个类后,这个类不能被继
- C#开发WinForm,如何实现TextBox获取输入焦点时自动全选?&nbs
- 一、策略模式到底是什么?策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替
- 本文实例为大家分享了Java分页展示的具体代码,供大家参考,具体内容如下先上图吧,大致如图,也就提供个思路(ps:使用了SSH框架) 前台J
- 本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下一、文件上传 struts提交的文件组件上传, 前