开发中有些手机上虚拟导航栏(NavigationBar)是可以被控制显示和隐藏的,在界面中有时候往界面根布局中添加的view是通过计算好高度设置进去的,在有些情况下虽然你添加进去的布局已经是Mach_Parent,但当你的NavigationBar被拖动隐藏以后可能会导致内部添加的view的高度底部出现一段空白,这个时候显示不美观了,只能再拖动设置增加高度用来撑满。此时,需要有一个用来监听NavigationBar的显示和隐藏的方法来实现就好了。可是找了好久,发现Android好像是不带NavigationBar的监听的,怎么办呢?
下面介绍一种从另一个角度考虑界面发生变化的时候判断是否是NavigationBar的显示和隐藏。
Step1
// 在初始化View的时候通过findViewById查找activity的根布局容器:
ViewGroup mRootLayout = (ViewGroup) findViewById(android.R.id.content);
Step2
boolean mLayoutComplete;// 用于判断布局是否初始化完成
private void onNavigationBarStatusChanged() {
mRootLayout.post(() -> {
// 布局完成
mLayoutComplete =true;
});
mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
if (!mLayoutComplete){
return;
}
onNavigationBarStatusChanged(mRootLayout);
});
}
private int mRootlayoutHeight =0;// 用于记录上一次屏幕的高度
public void onNavigationBarStatusChanged(ViewGroup rootlayout) {
int _rh = rootlayout.getHeight();// 当前屏幕高度
if (mRootlayoutHeight ==0) {
mRootlayoutHeight = _rh;// 记录首次变化的屏幕高度
}
if (mRootlayoutHeight != _rh){// 如果为true,则说明NavigationBar发生的显示和隐藏。
changeHeight = _rh -mRootlayoutHeight;//(备注) 说明:如果计算的值差不多在屏幕一半的2/3高度左右则大概说明是键盘发生的显示和隐藏
int pagerviewHeight =container.getHeight();// 获取需要改变的view的高度
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)container.getLayoutParams();
layoutParams.height =pagerviewHeight +changeHeight;
container.setLayoutParams(layoutParams);
mRootlayoutHeight = _rh;// 将当前高度重新赋值为最新临时变量
}
}
这只是一点点思路,方法可能还有更多,但能给你提供思路也够了。
网友评论