欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android如何解决虚拟按键栏遮挡问题

程序员文章站 2022-04-13 10:06:04
最近在公司的项目中 , 华为用户反馈出了一个问题 , 华为手机底部有虚拟按键栏把应用的底部内容遮挡住了 , 现在已经把这个问题解决了 , 记录一下,给各位遇到相同问题的童鞋做一下参考.这里的解决方案还...

最近在公司的项目中 , 华为用户反馈出了一个问题 , 华为手机底部有虚拟按键栏把应用的底部内容遮挡住了 , 现在已经把这个问题解决了 , 记录一下,给各位遇到相同问题的童鞋做一下参考.

这里的解决方案还是相对比较简单的,首先判断用户的手机是否存在虚拟按键,若存在,那么就获取虚拟按键的高度,然后再用代码设置相同高度的textview,这样手机的虚拟按键就不会将底部的内容遮挡住了。

处理虚拟按键栏工具类:

public class screenutils {
  //获取虚拟按键的高度
  public static int getnavigationbarheight(context context) {
    int result = 0;
    if (hasnavbar(context)) {
      resources res = context.getresources();
      int resourceid = res.getidentifier("navigation_bar_height", "dimen", "android");
      if (resourceid > 0) {
        result = res.getdimensionpixelsize(resourceid);
      }
    }
    return result;
  }

  /**
   * 检查是否存在虚拟按键栏
   *
   * @param context
   * @return
   */
  @targetapi(build.version_codes.ice_cream_sandwich)
  public static boolean hasnavbar(context context) {
    resources res = context.getresources();//读取系统资源函数
    int resourceid = res.getidentifier("config_shownavigationbar", "bool", "android");//获取资源id
    if (resourceid != 0) {
      boolean hasnav = res.getboolean(resourceid);
      // check override flag
      string snavbaroverride = getnavbaroverride();
      if ("1".equals(snavbaroverride)) {
        hasnav = false;
      } else if ("0".equals(snavbaroverride)) {
        hasnav = true;
      }
      return hasnav;
    } else { // fallback
      return !viewconfiguration.get(context).haspermanentmenukey();
    }
  }

  /**
   * 判断虚拟按键栏是否重写
   * @return
   */
  private static string getnavbaroverride() {
    string snavbaroverride = null;
    if (build.version.sdk_int >= build.version_codes.kitkat) {
      try {
        class c = class.forname("android.os.systemproperties");
        method m = c.getdeclaredmethod("get", string.class);
        m.setaccessible(true);
        snavbaroverride = (string) m.invoke(null, "qemu.hw.mainkeys");
      } catch (throwable e) {
      }
    }
    return snavbaroverride;
  }
}

调用工具类方法 , 获取虚拟按键高度:

//处理虚拟按键
//判断用户手机机型是否有虚拟按键栏       
 if(screenutils.hasnavbar(getapplicationcontext())){
  setnavigationbar();
  }

 //处理虚拟按键
 private void setnavigationbar() {
  int barheight = screenutils.getnavigationbarheight(getapplicationcontext());
  linearlayout.layoutparams barparams = new linearlayout.layoutparams(viewgroup.layoutparams.match_parent,viewgroup.layoutparams.wrap_content);
  textview tv = new textview(this);
  tv.setheight(barheight);
  tv.setwidth(viewgroup.layoutparams.match_parent);
  tv.setbackgroundcolor(color.black);
  llnavigationbar.addview(tv,barparams);
 }

到这里就结束啦!

以上就是android如何解决虚拟按键栏遮挡问题的详细内容,更多关于android 虚拟按键栏遮挡的资料请关注其它相关文章!