看源码:制作沉浸式状态栏

public class StatusBarUtil {

    public static void setStatusBarColor(Activity activity, int color) {
        //5.0以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            activity.getWindow().setStatusBarColor(color);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //4.4-5.0之间
            //思路,先把整个布局变成全屏,然后给statusBar的位置放一个布局
            //设置全屏
            // 这样写阻挡住了statusBar的内容
            // activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            //初始化要添加的view
            View view = new View(activity);
            ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusHeight(activity));
            view.setLayoutParams(layoutParams);
            view.setBackgroundColor(color);
          
            //添加到DecorView中 
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(view);
            
 			//避免在xml中设置 android:fitsSystemWindows="true"
            //DecorView会加载一个android.R.layout.screen_simple的LinearLayout布局
            //LinearLayout里面加载了一个android.R.id.content的FrameLayout布局
            //这个content就是放置activity布局的容器,这里我们跨过一层,直接找到content
            ViewGroup contentView = activity.findViewById(android.R.id.content);
            contentView.setFitsSystemWindows(true);
            //或者 设置statusBar高的上padding
            //contentView.setPadding(0,getStatusHeight(activity),0,0);
        }
        //4.4以下处理不了
    }

    //这部分是核心,需要去看源码,获得id
    private static int getStatusHeight(Activity activity) {
        int id = activity.getResources().getIdentifier("status_bar_height","dimen","android");
        return activity.getResources().getDimensionPixelOffset(id);
    }
}

这里再总结一下,我们看到屏幕的层次,以我们上面代码的思路来说,从上到下的顺序为
Window >>>> DecorView >>>>LinearLayout(R.layout.screen_simple)>>>> FrameLayout(android.R.id.content) >>>> Activity
我们利用系统id获得到高度,所设置的View是放置在了DecoView中,这时view其实是遮挡住content容器上面部分自己本身高度的,调整之后就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值