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

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

这里的解决方案还是相对比较简单的,首先判断用户的手机是否存在虚拟按键,若存在,那么就获取虚拟按键的高度,然后再用代码设置相同高度的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 虚拟按键栏遮挡的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android实现隐藏手机底部虚拟按键

    现在的手机比较流行底部带虚拟按键,比如华为.nexus,一般情况下对开发一个APP没啥影响,但是不一般情况下就会有影响的,比如全屏录像功能, 用简单的方法直接获取camera支持的手机屏幕分辨率然后用SurfaceView全屏渲染出来,这时由于底部虚拟按键占用了一定的高度的屏幕空间,这时图像会被压缩, 特别是拍头像时会很明显,如图: 接下来加上几个方法就OK 了,代码如下 /** * 隐藏虚拟按键,并且全屏 */ protected void hideBottomUIMenu(){ //隐藏虚拟

  • android底层去掉虚拟按键的实例讲解

    找到framework/base/core/res/res/values/dimens.xml,在其中把Navigation的配置改成0 <!-- Height of the bottom navigation / system bar. --> <dimen name="navigation_bar_height">0dp</dimen> <!-- Height of the bottom navigation bar in portrait

  • Android实现手机游戏隐藏虚拟按键

    手机游戏实现Android隐藏虚拟按键,供大家参考,具体内容如下 在华为等型号的手机会有虚拟按键,在进入游戏的时候,需要全屏隐藏这个按键,并在下拉状态栏的时候,会重新呼出虚拟按键. 游戏的加载过程中,初始化检查更新,然后进入到游戏画面,实际上是android的2个view的切换. 其中MainActivity中,在onCreate()方法中添加如下函数并且复写一个方法就可以了. @Override protected void onCreate(Bundle icicle) { hideNavi

  • Android实现状态栏和虚拟按键背景颜色的变化实例代码详解

    今天介绍一下,我在项目开发过程中,实现状态栏和虚拟按键背景颜色变化的方法,实现方式是,通过隐藏系统的状态栏和虚拟按键的背景,实现图片和背景显示到状态栏和虚拟按键下方.下面来看实现代码: 实现状态栏背景的设置 状态栏工具类 public class StatusBarUtil { /** * 设置沉浸式状态栏 * * @param activity 需要设置的activity */ public static void setTransparent(Activity activity) { //A

  • Android dialog 去除虚拟按键的解决方法

    Android 部分机型没有物理按键,只有虚拟按键,Activity全屏方法如下: 1.在 setContentView(R.layout.activity_main);之前添加 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 2.当用户划出虚拟按键后,自动再隐藏方法如下: getWindow().getDecorView().setOnSystemUiVisibilit

  • 解决Android 虚拟按键遮住了页面内容的问题

    在启动页的时候华为手机虚拟按键遮挡住了启动页下面的字找了找解决办法,特地记录一下 第一种办法:扩展虚拟按键 //状态栏 @ 顶部getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//A //导航栏 @ 底部getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//B //这个加在哪个布局,该布局就会相应

  • Android隐藏手机底部虚拟按键的方法

    现在的Android手机有好多底部带虚拟按键,比如华为.nexus.魅族等等,一般情况下对APP没啥影响,但是有时候就必须要强制隐藏. 例如:游戏的时候,拍照的时候. 接下来加上几个方法就OK 了,代码如下: /** * 隐藏虚拟按键,并且设置成全屏 */ protected void hideBottomUIMenu(){ if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api

  • Android 虚拟按键适配动态调整布局的方法

    最近项目中遇到了华为虚拟按键适配的问题,主页是个RecylerView(如下图),如果不做适配,在界面初始化完毕后,虚拟按键会遮挡页面或者空出一些留白部分,针对这个问题上网找了些资料,总结了以下方法 首页下部分是RecylerView 首页下半部分是个RecylerView(针对适配) 监听虚拟键的切换 注册系统广播 getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_is_m

  • Android 虚拟按键与沉浸式的适配方法

    根据公司产品的要求,app要实现全屏模式,也就是4.4以后的所谓的沉浸式. 在values-v19和values-v21的styles里添加以下代码,实现19以上的系统的沉浸式: <style name="AppBaseTheme" parent="android:Theme.Holo.Light.NoActionBar.TranslucentDecor"> <item name="android:windowTranslucentSta

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

    最近项目进行适配的时候发现部分(如华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示,故调用虚拟按键隐藏方法使之隐藏,然而发现出现如下问题: 手动操作隐藏虚拟按键后出现长白条区域 不自动隐藏 滑出状态栏后虚拟按键也出来,状态栏隐藏后虚拟却不跟着隐藏 在没有虚拟按键的设备上影响了SurfaceView全屏显示图传(原本全屏显示的图传在切出去再进来时变成了小屏显示) 通过google了很多方法并尝试终于解决了这个问题,达到如下效果: 每次进入界面时虚拟按键自动隐藏

随机推荐