软件编程
位置:首页>> 软件编程>> Android编程>> Android适配底部虚拟按键的方法详解

Android适配底部虚拟按键的方法详解

作者:yuanzhihui123  发布时间:2023-11-09 18:20:55 

标签:Android,虚拟,按键

最近项目进行适配的时候发现部分(如华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示,故调用虚拟按键隐藏方法使之隐藏,然而发现出现如下问题:

手动操作隐藏虚拟按键后出现长白条区域

不自动隐藏

滑出状态栏后虚拟按键也出来,状态栏隐藏后虚拟却不跟着隐藏

在没有虚拟按键的设备上影响了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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com