欢迎来到代码驿站!

Android代码

当前位置:首页 > 移动开发 > Android代码

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

时间:2021-02-26 10:54:36|栏目:Android代码|点击:

最近项目中遇到了华为虚拟按键适配的问题,主页是个RecylerView(如下图),如果不做适配,在界面初始化完毕后,虚拟按键会遮挡页面或者空出一些留白部分,针对这个问题上网找了些资料,总结了以下方法

首页下部分是RecylerView

首页下半部分是个RecylerView(针对适配)

监听虚拟键的切换

注册系统广播

getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_is_min"), true, mNavigationStatusObserver);
private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {
    @Override
    public void onChange(boolean selfChange) {
      int navigationBarIsMin = Settings.System.getInt(getContentResolver(),
          "navigationbar_is_min", 0);
      if (navigationBarIsMin == 1) {//导航键隐藏了
        Log.e("导航键隐藏了", "-----");
        gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);
      } else {//导航键显示了
        Log.e("导航键显示了", "-----");
        gridView_Home.getViewTreeObserver().addOnGlobalLayoutListener(HomeActivity.this);
      }
    }
  };

给View添加全局的布局监听器

可以看到当虚拟按键切换的时候我会调用view的getViewTreeObserver().addOnGlobalLayoutListener给view设置全局的布局监听器,用于获取当前view可显示的实际高度,然后根据高度动态设置子item的高度

布局监听器的回调

在回调中测量RecylerView可显示的实际高度

 @Override
  public void onGlobalLayout() {
    refreshGridViewHeight();
  }

注意这个回调是会调用多次的,获取完高度后要移除这个监听,否则会造成界面卡顿

private void refreshGridViewHeight() {
    gridView_Home.post(new Runnable() {
      @Override
      public void run() {
        //获取到宽度和高度后,可用于计算
        int height = gridView_Home.getHeight();
        //根据屏幕高度计算单个菜单的高度,保证屏幕能被填满
        final int itemHeight = height / 3 - 3;
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            homeMenuAdapter.setIemtHeight(itemHeight);
            gridView_Home.setAdapter(homeMenuAdapter);
            mPresenter.refushGridData();
            if (Build.VERSION.SDK_INT < 16) {
              gridView_Home.getViewTreeObserver().removeGlobalOnLayoutListener(HomeActivity.this);
            } else {
              gridView_Home.getViewTreeObserver().removeOnGlobalLayoutListener(HomeActivity.this);
            }
          }
        });
      }
    });

这个移除布局监听的方法还要兼容低版本,所以要分情况,具体看代码

最后记得在Activity的onDestroy或界面销毁的地方注销刚才设置的系统广播接收者

getContentResolver().unregisterContentObserver(mNavigationStatusObserver);

上一篇:Android 获取手机联系人实例代码详解

栏    目:Android代码

下一篇:Android 自定义View的构造函数详细介绍

本文标题:Android 虚拟按键适配动态调整布局的方法

本文地址:http://www.codeinn.net/misctech/70541.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有