一android沉浸式+虚拟按键
沉浸遇上了华为的虚拟键盘,当android:fitsSystemWindows设置为false就会出现下面布局被遮挡的情况,尤其是部分没法隐藏的机器。
百度之后大多数居然是让去掉沉浸式。要么这个设置 android:fitsSystemWindows="true"。但是设置成true我的Banner滚动图片显示不到标题栏上,尴尬。最后找到一片文章参考然后自己改了下完美实现,
个人思路
红色框表示屏幕,蓝色表示我首页的主布局,黑色表示根据虚拟按钮的背景,因为设置成透明色默认显示不好看。思路是求出显示区域大小,根据大小调整蓝色区域,这时候黑色区域会根据蓝色区域大小上移动活着下移动。所以在布局中黑色区域高度可以大但是不能小。
布局文件:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#0000"
>
//这是蓝色区域布局因为是主页布局
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#fff"
>
//主要布局显示首页
//黑色区域主要是用来当虚拟按键的样色
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#000">
//用来计算蓝色区域高度的工具类
public class AndroidBag {
// For more information, see https://code.google.com/p/android/issues/detail?id=5497
// To use this class, simply invoke assistActivity() on an Activity that already has its content view set.
/**
* 关联要监听的视图
*
* @param viewObserving
*/
public static void assistActivity(View viewObserving,Activity activity) {
new AndroidBag(viewObserving,activity);
}
private View mViewObserved;//被监听的视图
private int usableHeightPrevious;//视图变化前的可用高度
private ViewGroup.LayoutParams frameLayoutParams;
Activity activity;
private AndroidBag(View viewObserving ,Activity activity) {
this.activity=activity;
mViewObserved = viewObserving;
//给View添加全局的布局监听器
mViewObserved.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
resetLayoutByUsableHeight(computeUsableHeight());
}
});
frameLayoutParams = mViewObserved.getLayoutParams();
}
private void resetLayoutByUsableHeight(int usableHeightNow) {
//比较布局变化前后的View的可用高度
if (usableHeightNow != usableHeightPrevious) {
//如果两次高度不一致
//将当前的View的可用高度设置成View的实际高度
frameLayoutParams.height = usableHeightNow;
mViewObserved.requestLayout();//请求重新布局
usableHeightPrevious = usableHeightNow;
}
}
/**
* 计算视图可视高度
*
* @return
*/
private int computeUsableHeight() {
Rect r = new Rect();
mViewObserved.getWindowVisibleDisplayFrame(r);
Display display = activity.getWindowManager().getDefaultDisplay();
return ((r.bottom - r.top)+display.getHeight()-(r.bottom - r.top));
}
}
沉浸式代码和调用代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
调用代码
AndroidBag.assistActivity(findViewById(R.id.line),this);
参考地址http://blog.csdn.net/c15522627353/article/details/52452490