【Android】沉浸式状态栏+固定高度的Title栏

新手上路
直接po代码(复制的时候记得加上setBar)

先是网上很好找到的“通过设置全屏,设置状态栏透明”

/**
     * 通过设置全屏,设置状态栏透明
     * @param activity
     */
    public static void fullScreen(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色
                Window window = activity.getWindow();
                View decorView = window.getDecorView();
                //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间
                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
                decorView.setSystemUiVisibility(option);
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(Color.TRANSPARENT);
                //导航栏颜色也可以正常设置
                window.setNavigationBarColor(Color.TRANSPARENT);
            } else {
                Window window = activity.getWindow();
                WindowManager.LayoutParams attributes = window.getAttributes();
                int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
                int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
                attributes.flags |= flagTranslucentStatus;
//                attributes.flags |= flagTranslucentNavigation;
                window.setAttributes(attributes);
            }
        }
    }

在这基础上增加几个方法

dp -> px 转换
getResources().getDisplayMetrics().density 获取的是当前手机的分辨率,再来计算高度

	/**
     * @param context
     * @param hight  想要设置的Title高度
     * @return
     */
    private static int dp2px(Context context,int hight){
        float scale=context.getResources().getDisplayMetrics().density;
        return (int)((float) hight *scale+0.5f);
    }

获取状态栏高度
获取到的单位是px
举个栗子:魅蓝 note6 是 66,小米8是 110

private static int getStateBar(Context context){
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }

再重新设置高度
当然 这里的RelativeLayout headerLayout 也可以更换为其他布局

/**
     * @param c
     * @param headerLayout Title 栏
     */
    private static void setBar(Context context, RelativeLayout headerLayout){
        int i = getStateBar(context);
        ViewGroup.LayoutParams linearParams =  headerLayout.getLayoutParams();
        linearParams.height = BarTool.dp2px(context)+i;
        headerLayout.setLayoutParams(linearParams);
    }

回过头,再修改一下设置全屏的方法

Activity activity 设置全屏化使用
Context context 顶部title栏延伸使用
RelativeLayout relativeLayout 顶部title栏
Boolean show 是否重设高度
举个栗子:在没有Title栏的情况下也需要全屏化

public static void fullScreen(Activity activity,Context context,RelativeLayout relativeLayout,Boolean show) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        ......
            } else {
		 ......
        }
        if(show){
            setBar(context,relativeLayout);
        }

    }

调用

理论上Activity 和 Context和可以合并为一个 只传Activity
在onCreate()中直接调用

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        BarTool.fullScreen(this,headerLayout,true);
    }

当没有title栏时,将headerLayout设为null,show设置为false

	BarTool.fullScreen(activity,null,false);

强行总结

比较奇怪的是,偶尔会莫名其妙的报错(猜测是fragment分别设置不同样式时造成的),所以考虑一下老老实实传值
再加一个Content参数,给setBar使用。

BarTool.fullScreen(activity,context,null,false);

至此,给每个页面都用上,就完事了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值