软件编程
位置:首页>> 软件编程>> Android编程>> Android 虚拟按键适配动态调整布局的方法

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

作者:i_SamHuang  发布时间:2022-03-03 07:20:24 

标签:Android,虚拟,按键

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

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

首页下部分是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);

来源:https://blog.csdn.net/sam0750/article/details/73478214

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com