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

来源:互联网 发布:centos多线程下载命令 编辑:程序博客网 时间:2024/06/15 20:34

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

    就是这样一个简单的不能再简单的框架,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();
    还用解释么?一眼就看懂了,注释写这么清楚。

项目链接

0 0
原创粉丝点击