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,虚拟,按键
0
投稿

猜你喜欢

  • JAVA使用POI获取Excel的列数与行数

    2021-10-03 12:53:37
  • 详谈java 堆区、方法区和栈区

    2023-11-23 18:35:22
  • springboot依赖冲突问题及解决过程

    2023-03-13 11:49:53
  • Android 利用 APT 技术在编译期生成代码

    2023-12-20 14:46:23
  • springboot中bean的加载顺序问题

    2022-01-04 19:55:57
  • 一文助你搞懂参数传递原理解析(java、go、python、c++)

    2022-04-04 13:10:15
  • 在Android项目中使用AspectJ的方法

    2023-02-01 23:33:54
  • springboot返回值转成JSONString的处理方式

    2022-09-27 12:04:46
  • Android Studio工程导入及坑的解决

    2022-01-12 20:48:31
  • 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
  • Android view自定义实现动态进度条

    2023-09-16 00:40:38
  • C#实现视频的批量剪辑功能

    2023-07-15 06:18:30
  • springboot对压缩请求的处理方法

    2022-02-11 14:00:59
  • 一文带你吃透JSP增删改查实战案例详细解读

    2021-08-17 17:10:22
  • 详解Java中方法重写与重载的区别(面试高频问点)

    2022-07-19 10:36:48
  • java 实现简单圣诞树的示例代码(圣诞节快乐)

    2023-03-13 13:13:37
  • Java 比较接口comparable与comparator区别解析

    2022-11-26 20:54:24
  • asp之家 软件编程 m.aspxhome.com