Android沉浸式状态栏

学习Android中设计风格之一的沉浸式状态栏布局效果:适配了Activity和Fragment的工具类,注意在使用此工具类的过程中需要把application里的theme属性修改为NoActionBar

android:theme="@style/Theme.AppCompat.Light.NoActionBar"

以下先贴出所有代码

自定义的BaseActivity

@SuppressLint("NewApi")
public abstract class BaseActivity extends AppCompatActivity {
       private FragmentManager fragmentManager;//fragment管理器
        //当前正在展示的fragment
        private BaseFragment showFragment;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(getContentId());
            //注册activity
            //获得fragment 管理对象
            fragmentManager = getSupportFragmentManager();
            /**
             * 沉浸式状态栏
             */
            if(isOpenStatus()) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    Window window = getWindow();
                    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                    window.setStatusBarColor(Color.TRANSPARENT);
                } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                }
                //获得状态栏的高度
                int height = ScreenUtil.getStatusHeight(this);
                if(height != -1){
                    //设置padding
                    View view = findViewById(R.id.actionbar);
                    if(view != null){
                        view.setPadding(0,height,0,0);
                        if(view instanceof Toolbar){
                            setSupportActionBar((Toolbar) view);
                            //隐藏标题
                            getSupportActionBar().setDisplayShowTitleEnabled(false);

                        }
                    }
                }
            }

            init();
            bindListener();
            loadDatas();
        }
        /**
         * 初始化
         */
        protected void init(){
        }
        /**
         * 绑定监听
         */
        protected void bindListener(){
        }
        /**
         * 加载数据
         */
        protected void loadDatas(){
        }
        /**
         * 以动画的方式启动activity
         * @param intent
         * @param animinid
         * @param animoutid
         */
        public void startActivityForAnimation(Intent intent, int animinid, int animoutid){
            startActivity(intent);
            overridePendingTransition(animinid, animoutid);
        }
        /**
         * 展示fragment
         */
        protected void showFragment(int resid,BaseFragment fragment){
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开始一个新的事物
            //隐藏正在展示的fragment
            if(showFragment != null){
                fragmentTransaction.hide(showFragment);
            }
            //展示需要显示的fragment对象
            Fragment mfragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());
            if(mfragment != null){
                fragmentTransaction.show(mfragment);
                showFragment = (BaseFragment) mfragment;
            }else{

                fragmentTransaction.add(resid,fragment,fragment.getClass().getName());
                showFragment = fragment;
            }
            fragmentTransaction.commit();//提交事物
        }

        /**
         * 获得activity显示的布局ID
         * @return
         */
        protected abstract int getContentId();

        /**
         * 是否打开沉浸式状态栏
         * @return
         */
        public boolean isOpenStatus(){
            return true;
        }
}
自定义的BaseFragment
public abstract class BaseFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(getContentId(), container, false);
        return view;
    }
    /**
     * 该方法紧跟onCreateView之后执行
     * @param view
     * @param savedInstanceState
     */
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

        //查找actionbar控件设置paddingtop
        BaseActivity activity = (BaseActivity) getActivity();
        //判断activity是否开启沉浸式通知栏
        if(activity.isOpenStatus()){
            View actionbarview = view.findViewById(R.id.actionbar);
            if(actionbarview != null){
                int heigth = ScreenUtil.getStatusHeight(getActivity());
                actionbarview.setPadding(0, heigth, 0, 0);
            }
        }

        init(view);
        bindListener();
        loadDatas();
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Bundle bundle = getArguments();
        if(bundle != null){
            getDatas(bundle);
        }
    }

    /**
     *获得数据
     */

    protected void getDatas(Bundle bundle) {
    }

    /**
     *初始化的方法
     * @param view
     */
    protected void init(View view) {
    }

    /**
     *绑定的监听
     */
    protected void bindListener() {
    }

    /**
     *加载数据
     */
    protected void loadDatas() {
    }
    /**
     *传入布局ID
     */
    protected abstract int getContentId();
}

代码内用到的ScreenUtil

 public static int getStatusHeight(Context context){
        /**
         * 获取资源文件的id文件
         */
        int resid = context.getResources().getIdentifier("status_bar_height","dimen","android");
        if(resid > 0){
            return context.getResources().getDimensionPixelSize(resid);
        }
        return -1;
    }

最后在values文件夹下床架一个idsXML文件

<resources>
    <item name="actionbar" type="id">actionbar_id</item>
</resources>

最后大功告成,在使用过程中只需要定义自己的activity类或者fragment去继承BaseActivity或者BaseFragment就可以实现完美的沉浸式状态栏布局



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值