概述
一android沉浸式+虚拟按键
沉浸遇上了华为的虚拟键盘,当android:fitsSystemWindows设置为false就会出现下面布局被遮挡的情况,尤其是部分没法隐藏的机器。
百度之后大多数居然是让去掉沉浸式。要么这个设置 android:fitsSystemWindows="true"。但是设置成true我的Banner滚动图片显示不到标题栏上,尴尬。最后找到一片文章参考然后自己改了下完美实现,
个人思路
红色框表示屏幕,蓝色表示我首页的主布局,黑色表示根据虚拟按钮的背景,因为设置成透明色默认显示不好看。思路是求出显示区域大小,根据大小调整蓝色区域,这时候黑色区域会根据蓝色区域大小上移动活着下移动。所以在布局中黑色区域高度可以大但是不能小。
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#0000"
>
//这是蓝色区域布局因为是主页布局
<LinearLayout
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#fff"
>
//主要布局显示首页
</LinearLayout>
//黑色区域主要是用来当虚拟按键的样色
<View
android:id="@+id/butt"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#000"></View>
</LinearLayout>
//用来计算蓝色区域高度的工具类
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) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //该参数指布局能延伸到navigationbar,我们场景中不应加这个参数
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
window.setNavigationBarColor(Color.TRANSPARENT); //设置navigationbar颜色为透明
}else {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
调用代码
AndroidBag.assistActivity(findViewById(R.id.line),this);
参考地址http://blog.csdn.net/c15522627353/article/details/52452490
最后
以上就是愤怒小白菜为你收集整理的android沉浸式+虚拟按键+Fragment+CoordinatorLayout(1)的全部内容,希望文章能够帮你解决android沉浸式+虚拟按键+Fragment+CoordinatorLayout(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复