700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android 虚拟按键适配动态调整布局

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

时间:2022-05-24 07:10:00

相关推荐

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

监听虚拟键的切换给View添加全局的布局监听器参考链接

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

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

监听虚拟键的切换

注册系统广播

getContentResolver().registerContentObserver(Settings.System.getUriFor("navigationbar_is_min"), true, mNavigationStatusObserver);

private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {@Overridepublic 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可显示的实际高度

@Overridepublic void onGlobalLayout() {refreshGridViewHeight();}

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

private void refreshGridViewHeight() {gridView_Home.post(new Runnable() {@Overridepublic void run() {//获取到宽度和高度后,可用于计算int height = gridView_Home.getHeight();//根据屏幕高度计算单个菜单的高度,保证屏幕能被填满final int itemHeight = height / 3 - 3;runOnUiThread(new Runnable() {@Overridepublic 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适配底部返回键等虚拟键盘的完美解决方案

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。