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

 更新时间:2018年07月28日 13:49:42   作者:i_SamHuang  
今天小编就为大家分享一篇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布局技巧之include、merge与ViewStub标签的巧用

    Android布局技巧之include、merge与ViewStub标签的巧用

    Android 官方提供了三个用来优化布局的标签,分别是include、merge与ViewStub,下面这篇文章主要给大家介绍了关于Android布局技巧之include、merge与ViewStub标签巧用的相关资料,需要的朋友可以参考下
    2018-06-06
  • 详解Android数据存储之SQLCipher数据库加密

    详解Android数据存储之SQLCipher数据库加密

    对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,本篇文章主要介绍了Android数据存储之SQLCipher数据库加密,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • Android仿QQ空间动态界面分享功能

    Android仿QQ空间动态界面分享功能

    这篇文章主要介绍了Android仿QQ空间动态界面分享功能,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2017-04-04
  • Flutter如何轻松实现动态更新ListView浅析

    Flutter如何轻松实现动态更新ListView浅析

    在Android中通常都会用到listview.那么flutter里面怎么用呢?下面这篇文章主要给大家介绍了关于Flutter如何轻松实现动态更新ListView的相关资料,需要的朋友可以参考下
    2022-02-02
  • Android Flutter实现视频上滑翻页效果的示例代码

    Android Flutter实现视频上滑翻页效果的示例代码

    我们在短视频应用中经常会看到不停上滑浏览下一条视频的沉浸式交互效果,这种交互能够让用户不停地翻页,直到找到喜欢的视频内容。本文将通过Flutter中的PageView组件实现,感兴趣的可以了解一下
    2022-10-10
  • Android实现页面滑动切换动画

    Android实现页面滑动切换动画

    这篇文章主要为大家详细介绍了Android实现页面滑动切换动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android开发之资源目录assets与res/raw的区别分析

    Android开发之资源目录assets与res/raw的区别分析

    这篇文章主要介绍了Android开发之资源目录assets与res/raw的区别,结合实例形式分析了Android开发中资源目录assets与res/raw的具体功能、使用方法与区别,需要的朋友可以参考下
    2016-01-01
  • Android Handler leak分析及解决办法详解

    Android Handler leak分析及解决办法详解

    这篇文章主要介绍了Android Handler leak分析及解决办法详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 详解Flutter中Dart集合使用教程

    详解Flutter中Dart集合使用教程

    集合是应用程序中最为常见的数据结构,Dart一共支持四种集合,其中核心的List, Map和Set在基础框架中。本文将详细讲解Dart集合的最佳实践,需要的可以参考一下
    2022-05-05
  • Android嵌套线性布局玩法坑解决方法

    Android嵌套线性布局玩法坑解决方法

    这篇文章主要为大家介绍了Android嵌套线性布局玩法坑解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论