android沉浸式+虚拟按键+Fragment+CoordinatorLayout(1)

一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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值