问题:华为手机遮挡了文章底部的评论、分享、点赞等。
需求:
需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占满整个屏幕,当用户启用虚拟键时,应用能往上收缩,等于是被底部虚拟按键顶上来。
解决方案:
监听某个视图的变化,当可以看见的高度发生变化时,就对这个视图重新布局,保证视图不会被遮挡,也不会浪费屏幕空间。这一点尤其可用在像华为手机等可以隐藏和显示虚拟键盘上导致屏幕变化的手机上。
添加工具类
public class HuaWeiBottomUiFit {
/**
* 关联要监听的视图 *
* @param viewObserving
*/
public static void assistActivity(ViewviewObserving) {
new HuaWeiBottomUiFit(viewObserving);
}
private View mViewObserved;//被监听的视图
private int usableHeightPrevious;//视图变化前的可用高度
private ViewGroup.LayoutParamsframeLayoutParams;
private HuaWeiBottomUiFit(ViewviewObserving) {
mViewObserved = viewObserving;
//给View添加全局的布局监听器
mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(newViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
resetLayoutByUsableHeight(computeUsableHeight());
}
});
frameLayoutParams = mViewObserved.getLayoutParams();
}
private void resetLayoutByUsableHeight(intusableHeightNow) {
//比较布局变化前后的View的可用高度
if (usableHeightNow != usableHeightPrevious) {
//如果两次高度不一致
//将当前的View的可用高度设置成View的实际高度
frameLayoutParams.height = usableHeightNow;
mViewObserved.requestLayout();//请求重新布局
usableHeightPrevious = usableHeightNow;
}
}
/**
* 计算视图可视高度
*
*@return
*/
private int computeUsableHeight() {
Rect r = new Rect();
mViewObserved.getWindowVisibleDisplayFrame(r);
return (r.bottom-r.top);
}
}
然后在你需要解决这个问题的Activity的onCreate方法的setContentView(R.layout.contentframe);后面添加上 setContentView(R.layout.contentframe);HuaWeiBottomUiFit.assistActivity(findViewById(android.R.id.content));
如果你看的懂代码,你肯定知道assistActivity方法里放入的View是你 要调整高度的视图。
解决后: