Android实现沉浸式状态栏之再理解

前面学习的解决实现沉浸式状态栏的方法是AndroidManifest中的application的theme属性文件中设置

<item name="android:windowTranslucentStatus">true</item>

然后在每一个Activity的根布局中设置fitsSystemWindows属性为true,现在想想挺麻烦,时不时也会忘,今天在简书上看到一边文章点击打开链接

了解到沉浸式的意思其实是隐藏状态栏,也就是通常我们说的全屏,而透明化状态栏才是我们说的"沉浸式",那么要实现透明化状态栏必须是要设置

<item name="android:windowTranslucentStatus">true</item>这个的,当然你也可以在Activity的基类中设置,那么设置了这个属性就肯定要设置fitsSystemWindows属性为true,除了每个布局都定义之外,我们还可以把自定义的Activity基类给设置成abstract类型的,添加一个getLayoutId()方法,交给每个Activity去实现(因为所有的Activity都要继承这个基类),在Activity基类的onCreate方法中:

setContentView(getLayoutResId());//把设置布局文件的操作交给继承的子类
        ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
        View parentView = contentFrameLayout.getChildAt(0);
        if (parentView != null && Build.VERSION.SDK_INT >= 14) {
            parentView.setFitsSystemWindows(true);
        }
添加上述代码。很显然,这和添加fitsSystemWindows没什么两样,每一个Activity都要去实现这个方法。

除此之外,我们就只有自己在状态栏的位置补上一块和状态栏同等高度的View了,这就相当于自己实现了fitsSystemWindows属性效果,这样倒是一劳永逸,不过状态栏颜色还是不能设置成和当前页面最上层一致的颜色,太死板。

//自己填充statusBar部分(无法做到每个Activity页最上层的颜色都和状态栏一致)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            ViewGroup firstChildAtDecorView = ((ViewGroup) ((ViewGroup) getWindow().getDecorView()).getChildAt(0));
            View statusView = new View(this);
            ViewGroup.LayoutParams statusViewLp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight());
            //颜色的设置可抽取出来让子类实现之
            statusView.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));
            firstChildAtDecorView.addView(statusView, 0, statusViewLp);
        }

/**
     * 获取状态栏高度
     * @return
     */
    private int getStatusBarHeight() {
        int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            return getResources().getDimensionPixelSize(resId);
        }
        return 0;
    }



总之,实现透明化状态栏最好的方式还是添加fitsSystemWindows属性...


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值