基于SystemBarTint、BottomNavigationBar实现的一个简单的项目框架

写这个不是为了什么,仅仅是为了督促自己学习,进步。效果图:
这里写图片描述

    就是这样一个简单的不能再简单的框架,Actionbar用的是SystemBarTint(半透明化状态栏),主页底部导航栏用的是BottomNavigationBar。文章结尾有项目链接,需要一个积分,各位大哥大姐,赏小的一点积分用用呗。
    我带大家走一遍我的这个简单的框架。
    首先有一个基类BaseActivity,实现了一个自己写的接口ActivityInterface。这个类,我就重写了生命周期的几个方法,实现了接口里面控制代码整洁的几个方法。
public interface ActivityInterface {
    //初始化root界面
    void setRootView();
    //初始化控件
    void initView();
    //初始化数据
    void initData();
}
public abstract class BaseActivity extends FragmentActivity implements ActivityInterface {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRootView();
        initializer();
        registerBroadcast();
        System.out.print("--->onCreate");
    }
    //注册广播
    public void registerBroadcast() {
    }
    //注销广播
    public void unRegisterBroadcast() {
    }
    //初始化
    private void initializer() {
        initView();
        initData();
    }

    @Override
    protected void onStart() {
        super.onStart();
        System.out.print("--->onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();
        System.out.print("--->onStop");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.print("--->onPause");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.print("--->onRestart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.print("--->onResume");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unRegisterBroadcast();
        System.out.print("--->onDestroy");
    }
}
    这两个类没什么好说的。代码一眼就看明白了。再就是添加顶部导航栏的类NavigationActivity,我先把主要代码贴出来
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            setTranslucentStatus(true);
            SystemBarTintManager tintManager = new SystemBarTintManager(this);
            tintManager.setStatusBarTintEnabled(true);
            tintManager.setNavigationBarTintEnabled(true);        
            tintManager.setStatusBarTintResource(R.color.app_top_color);//通知栏所需颜色
        }
/**
     * 与SystemBarTintManager联合使用
     * @param b
     */
    @TargetApi(19)
    private void setTranslucentStatus(boolean b) {
        Window win = getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        if (b) {
            winParams.flags |= bits;
        } else {
            winParams.flags &= ~bits;
        }
        win.setAttributes(winParams);
    }
    上面的代码相当于就是这么使用SystemBarTint这个开源框架。基本上就是官方给的一个例子,不会用的童鞋可以百度一下。颜色自己设定,弄好之后你们或许会碰到一些问题,MD,说好的是透明的的呢,咋看不到时间,上面还有一条不透明的颜色。这是因为,你没有设定Activity不全屏显示,逗比。现在应用都没有title,把title也去掉。
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, 
                    WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);//设置不完全显示
    是不是恍然大悟啊,他这个透明状态栏只是说,在你设置了不全屏显示之后,在进入APP看到时间那一行的颜色你可以自己设定,而不是你手机主题的颜色仅此而已,在就是你有可能看到你的顶部导航栏上面的字显示不全是显示一半,亦或者根本看不到,被挡住了嘛,傻吊,你要设置padding,不然默认的就是从手机顶部开始的,上面又有一个时间的那一栏,就被挡住了。就是说,你的actionBar那一栏在你看到时间那一栏的下一层,你的actionBar被时间那一栏就被遮住了,这里我给一个动态获取actionbar高度的方法。然后你设置padding就可以了
/**
     * 状态栏高度算法
     * @param activity
     * @return
     */
    public static int getStatusHeight(Activity activity){
        int statusHeight = 0;
        Rect localRect = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect);
        statusHeight = localRect.top;
        if (0 == statusHeight){
            Class<?> localClass;
            try {
                localClass = Class.forName("com.android.internal.R$dimen");
                Object localObject = localClass.newInstance();
                int i5 = Integer.parseInt(localClass.getField("status_bar_height").get(localObject).toString());
                statusHeight = activity.getResources().getDimensionPixelSize(i5);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
        return statusHeight;
    }
    然后,你自己设定padding,用的actionbar的xml最外层的布局设置padding, 如:this.mMainLayout.setPadding(0,getStatusHeight(NavigationActivity.this),0,0);
    就这样。主要部分就到这里,在就是一些常规的,比方说标题动态设置啊,左边返回键的显示,隐藏,右边搜索功能之类的一些东西,我都是在这个activity里面实现的,子类继承这个类,然后实现其对应功能的方法就行了。
    接下来就是BottomNavigationBar底部导航栏了。别的先不说,我先接贴代码吧
//初始化底部栏
    private void initBottomBar() {
        itemOne = new BottomNavigationItem(R.mipmap.icon_one, R.string.tab_one);
        itemOne.setActiveColorResource(R.color.colorAccent);
        itemTwo = new BottomNavigationItem(R.mipmap.icon_two, R.string.tab_two);
        itemTwo.setActiveColorResource(R.color.colorAccent);
        itemThree = new BottomNavigationItem(R.mipmap.icon_three, R.string.tab_three);
        itemThree.setActiveColorResource(R.color.colorAccent);
        itemFour = new BottomNavigationItem(R.mipmap.icon_four, R.string.tab_four);
        itemFour.setActiveColorResource(R.color.colorAccent);
        bottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
        bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
        /**
         * 设置底部栏背景颜色,要与setMode或者setBackgroundStyle同时设置才有效果,不然没效果
         */
        bottomNavigationBar.setBarBackgroundColor(R.color.app_color);
        bottomNavigationBar.addItem(itemOne)
                .addItem(itemTwo)
                .addItem(itemThree)
                .addItem(itemFour)
                .setFirstSelectedPosition(0)//设置默认选择item
                .initialise();
        bottomNavigationBar.setTabSelectedListener(HomeActivity.this);//设置监听
    }
    其实,我都不知道该从哪里说。不会用BottomNavigationBar的童鞋,百度一下,很多教程。我只说我在集成的时候碰到的问题。底部导航栏就一个一个的item,需要几个就添加几个,我觉得最好是3-5个,多了用户体验也不好。上下结构的,上面图片,下面文字。还有点击效果,需要什么就设置什么,我觉得默认模式是用户体验最好,并且最实用的。底部导航栏,我只想说一句,在代码里面也有注释,那就是设置底部导航栏的背景颜色你要跟setMode或者是setBackgroundStyle方法同时设置才有效果,光实现setBarBackgroundColor这一个方法,你得不到你想要的效果。你会发现,你设置的颜色是按钮点下去之后变的颜色,导航栏的背景颜色还是原来的颜色。
    再就是实现他的监听方法:
@Override
    public void onTabSelected(int position) {//选中
        switch (position){
            case 0:
                setActivityTitle("Fish");
                showFragment(position);
                break;
            case 1:
                setActivityTitle("Fly");
                showFragment(position);
                break;
            case 2:
                setActivityTitle("Bird");
                showFragment(position);
                break;
            case 3:
                setActivityTitle("Coffee");
                showFragment(position);
                break;
        }
    }

    @Override
    public void onTabUnselected(int position) {//未选中

    }

    @Override
    public void onTabReselected(int position) {//再次选中

    }
    就这三个方法,选中,未选中,再次选中,直接在选中的那个方法里面实现显示哪个fragment就可以了,设置一下标题啊之类的。对了,还有一个BadgeItem,就类似于QQ有好友给你发新消息,之后,在消息那个button右上角有个红色的数字,表示有几条新消息,你没有看。BadgeItem就是这个东西。用法如下:
BadgeItem badgeItem = new BadgeItem();
                badgeItem.setHideOnSelect(true)//当点击这个BottomNavigationItem时,隐藏它身上的Badg
                        .setText("99")//多少条新消息
                        .setBackgroundColorResource(R.color.white)//Badge的背景色
                        .setBorderWidth(2)//Badge内容和边界的边距 类似于内边距
                        .setTextColor(Color.RED);//消息的颜色
                itemOne.setBadgeItem(badgeItem);
                bottomNavigationBar.initialise();
    还用解释么?一眼就看懂了,注释写这么清楚。

项目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海晨忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值