Android适配底部虚拟按键的方法详解
作者:yuanzhihui123 时间:2023-11-09 18:20:55
最近项目进行适配的时候发现部分(如华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示,故调用虚拟按键隐藏方法使之隐藏,然而发现出现如下问题:
手动操作隐藏虚拟按键后出现长白条区域
不自动隐藏
滑出状态栏后虚拟按键也出来,状态栏隐藏后虚拟却不跟着隐藏
在没有虚拟按键的设备上影响了SurfaceView全屏显示图传(原本全屏显示的图传在切出去再进来时变成了小屏显示)
通过google了很多方法并尝试终于解决了这个问题,达到如下效果:
每次进入界面时虚拟按键自动隐藏
手动滑出虚拟按键,当不操作屏幕时定时自动隐藏
当滑出状态栏时虚拟按键会跟着出来,也要处理让其和状态栏在不操作时自动隐藏
具体代码如下操作:
public class TestActivity extends AppCompatActivity {
private View decorView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//获取顶层视图
decorView = getWindow().getDecorView();
}
@Override
protected void onStart() {
//调用配置
init();
super.onStart();
}
private void init(){
int flag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
//判断当前版本在4.0以上并且存在虚拟按键,否则不做操作
if (Build.VERSION.SDK_INT < 19 || !checkDeviceHasNavigationBar()) {
//一定要判断是否存在按键,否则在没有按键的手机调用会影响别的功能。如之前没有考虑到,导致图传全屏变成小屏显示。
return;
} else {
// 获取属性
decorView.setSystemUiVisibility(flag);
}
}
/**
* 判断是否存在虚拟按键
* @return
*/
public boolean checkDeviceHasNavigationBar() {
boolean hasNavigationBar = false;
Resources rs = 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;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
注:有些时候要手动去调用上述代码中init()配置方法隐藏按键。如弹出dialog时虚拟按键会出来,此时要手动调用隐藏,还有弹出键盘等等。
记录一下,以后遇到此类问题可供参考。
来源:https://blog.csdn.net/yuanzhihui123/article/details/70064962
标签:Android,虚拟,按键
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
JAVA使用POI获取Excel的列数与行数
2021-10-03 12:53:37
详谈java 堆区、方法区和栈区
2023-11-23 18:35:22
springboot依赖冲突问题及解决过程
2023-03-13 11:49:53
![](https://img.aspxhome.com/file/2023/2/129252_0s.jpg)
Android 利用 APT 技术在编译期生成代码
2023-12-20 14:46:23
springboot中bean的加载顺序问题
2022-01-04 19:55:57
![](https://img.aspxhome.com/file/2023/0/62510_0s.png)
一文助你搞懂参数传递原理解析(java、go、python、c++)
2022-04-04 13:10:15
![](https://img.aspxhome.com/file/2023/5/130925_0s.jpg)
在Android项目中使用AspectJ的方法
2023-02-01 23:33:54
springboot返回值转成JSONString的处理方式
2022-09-27 12:04:46
Android Studio工程导入及坑的解决
2022-01-12 20:48:31
![](https://img.aspxhome.com/file/2023/9/122049_0s.jpg)
Java BufferWriter写文件写不进去或缺失数据的解决
2023-07-20 14:57:02
Android 通知的基本用法示例代码
2022-09-28 03:54:50
AndroidStudio 配置 AspectJ 环境实现AOP的方法
2021-09-03 10:09:01
mybatis in查询条件过长的解决方案
2022-06-08 12:44:14
![](https://img.aspxhome.com/file/2023/4/70594_0s.png)
Android view自定义实现动态进度条
2023-09-16 00:40:38
![](https://img.aspxhome.com/file/2023/5/138125_0s.gif)
C#实现视频的批量剪辑功能
2023-07-15 06:18:30
![](https://img.aspxhome.com/file/2023/3/96423_0s.png)
springboot对压缩请求的处理方法
2022-02-11 14:00:59
一文带你吃透JSP增删改查实战案例详细解读
2021-08-17 17:10:22
![](https://img.aspxhome.com/file/2023/6/129186_0s.png)
详解Java中方法重写与重载的区别(面试高频问点)
2022-07-19 10:36:48
java 实现简单圣诞树的示例代码(圣诞节快乐)
2023-03-13 13:13:37
![](https://img.aspxhome.com/file/2023/7/125597_0s.png)
Java 比较接口comparable与comparator区别解析
2022-11-26 20:54:24