封装一个BaseActivity并实现沉浸式状态栏

    早就听闻沉浸式状态栏的大名..但是一直不太明白那究竟是什么东西,所以就有意去搜索了一下,结果令我大失所望... 就是一个自定义view能够设置透明 或其他颜色来替换状态栏或者说成是遮盖住状态栏比较合适.. 当然我看网上介绍了一些比较高大上的沉浸式状态栏,能够实现颜色渐变的效果,确实能够对得起“沉浸式”这一说道.. 今天我这里会总结透明状态栏,和不同颜色的状态栏,虽然这种东西烂大街了,但是自己能力有限,那种高大上的渐变效果,还是等自己能力比较厉害的时候再去研究吧,毕竟这两种就已经可以满足项目中大多数的需求了,渐变效果也不是特别的必要.


沉浸式状态栏需要注意的一点是需要在布局文件最外侧层使用:

android:fitsSystemWindows="true"

这个东西是适应系统窗口大小的,再就是为了简便一些不用每次都写一大堆代码,所以我在BastActivity中封装的方法,当activity继承自BastActivity时,就能直接引用设置状态栏的方法,来起到简化代码的作用,话不多说直接上代码:

import android.app.Activity;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(setLayout());

        initView();
        initData();
    }

    // 设置布局
    abstract int setLayout();

    // 初始化组件
    protected abstract void initView();

    // 初始化数据
    protected abstract void initData();

    public <T extends View> T bindView(int id){
        return (T)findViewById(id);
    }

    public static void setColor(Activity activity,int color){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            // 设置状态栏透明
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 生成一个状态栏大小的矩形
            View StatusView = createStatusView(activity,color);
            // 添加statusView到布局中
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(StatusView);
            // 设置根布局的参数
            ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content))
                    .getChildAt(0);
            rootView.setFitsSystemWindows(true);
            rootView.setClipToPadding(true);
        }
    }

    /**
     * 生成一个和状态栏大小相同的矩形条
     * @param activity 需要设置的activity
     * @param color 状态栏的颜色值
     * @return 状态栏矩形条
     */
    private static View createStatusView(Activity activity, int color) {
        // 获得状态栏的高度
        int resourceId = activity.getResources()
                .getIdentifier("status_bar_height","dimen","android");
        int statusBarHeight = activity.getResources()
                .getDimensionPixelSize(resourceId);

        // 绘制一个和状态栏一样高度的矩形
        View statusView = new View(activity);
        LinearLayout.LayoutParams params = new LinearLayout
                .LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,statusBarHeight);
        statusView.setLayoutParams(params);
        statusView.setBackgroundColor(color);

        return statusView;
    }

    /***********************我是分割线***************************/
    
    /**
     * 使状态栏透明
     * 适用于图片作为背景的界面,此时需要图片填充到状态栏
     * @param activity 需要设置的activity
     */
    public static void setTranslucent(Activity activity){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            // 设置状态栏透明
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            // 设置根布局的参数
            ViewGroup rootView = (ViewGroup)((ViewGroup)activity
                    .findViewById(android.R.id.content)).getChildAt(0);
            rootView.setFitsSystemWindows(true);
            rootView.setClipToPadding(true);
        }
    }

}

以上是我封装的BastActivity,此外的两个方法setColor 和 setTranslucent方法可以在BastActivity中直接使用,但是也可以在被继承自BastActivity中调用,随你们喜欢~ 下面是MainActivity 继承自BastActivity的代码部分:

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends BaseActivity {

    private Button btn;

    @Override
    int setLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
//        setColor(MainActivity.this,Color.BLACK); // 改变状态栏的颜色
        setTranslucent(MainActivity.this); // 改变状态栏变成透明
        btn = bindView(R.id.btn);
    }

    @Override
    protected void initData() {
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "按钮被触发", Toast.LENGTH_SHORT).show();
            }
        });
    }

}


下面为MainActivity的布局文件:(在提一嘴 fitsSystemWindows = true 不要忘记写哦)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="sq.materialdesign.MainActivity"
    android:fitsSystemWindows="true"
    android:background="@mipmap/a_1">

    <Button
        android:id="@+id/btn"
        android:text="@string/xx"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

发个截图看下效果:



图片很吸引眼球不是么..?好久没有写博客了,今天偷偷的总结一些能够发出来的东西做一些整理和分享,一些不能发出来的东西就涉及到保密的功能和目前比较涉及到RMB的代码了,虽然我人很好但是无私奉献默默无闻的事情我可不干哼~ 如果我整理的代码对你有所帮助,记得点个赞谢啦~

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当我们需要在多个Activity中使用相同的逻辑时,可以将这些逻辑抽象到一个基类(Activity)中,在子类(Activity)中直接继承基类(Activity),并实现自己独有的逻辑即可。 下面是一个简单的BaseActivity实现,可以帮助你快速封装自己的BaseActivity。 ```java public abstract class BaseActivity extends AppCompatActivity { private ProgressDialog mProgressDialog; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); initViews(); initData(); } /** * 获取布局文件id */ protected abstract int getLayoutId(); /** * 初始化View */ protected abstract void initViews(); /** * 初始化数据 */ protected abstract void initData(); /** * 显示加载框 */ protected void showLoading() { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("加载中..."); mProgressDialog.setCancelable(false); } mProgressDialog.show(); } /** * 隐藏加载框 */ protected void hideLoading() { if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } } /** * 显示Toast */ protected void showToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } } ``` 在子类(Activity)中,只需要实现getLayoutId()、initViews()和initData()方法即可。另外,BaseActivity中还提供了showLoading()、hideLoading()和showToast()方法,可以在子类(Activity)中直接调用。 当我们需要在多个Activity中使用相同的逻辑时,只需要继承BaseActivity即可,无需重复编写代码,提高了代码的复用性和开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值