Android 虚拟按键适配动态调整布局
来源:互联网 发布:淘宝众筹文案模板 编辑:程序博客网 时间:2024/05/16 13:07
- 监听虚拟键的切换
- 给View添加全局的布局监听器
- 参考链接
最近项目中遇到了华为虚拟按键适配的问题,主页是个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);
参考链接
华为(HuaWei)虚拟按键的判断和监听
Android适配底部返回键等虚拟键盘的完美解决方案
阅读全文
0 0
- Android 虚拟按键适配动态调整布局
- Android适配之虚拟按键遮挡布局
- Android适配之状态栏和虚拟按键遮挡布局
- Android适配之虚拟按键遮挡布局
- android 虚拟按键遮挡布局
- android虚拟按键适配
- android 虚拟按键遮挡布局问题
- android虚拟按键挤压布局和硬件加速
- Android屏幕适配(底部虚拟按键)
- android屏幕适配----虚拟按键
- Android虚拟按键适配Popupwindow
- android 华为虚拟按键适配
- Android屏幕适配(底部虚拟按键)
- android集成slidingmenu后虚拟按键覆盖布局的解决方法
- Android适配华为手机虚拟按键显示或隐藏
- Android虚拟按键的判断与适配
- Android 虚拟按键与沉浸式的适配
- Android适配底部虚拟按键的方法
- CentOS6.4安装Oracle11g
- maven的目录结构
- Validation Set
- Vue简单介绍以及常用方法总结
- Linux网络基础——TCP报文中URG和PSH比较
- Android 虚拟按键适配动态调整布局
- Android基本常识
- 利用Servlet发送pdf文件到浏览器
- 【java】:java多线程编程
- android调用本地音视频文件获取信息
- 学习Linux命令(35)
- scrapy 报错 no module named win32api 的解决方案
- PAT-A-1065. A+B and C (64bit) (20)
- JS采用ActiveXObject实现用户在提交表单时屏蔽敏感词的功能