基于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
- 基于SystemBarTint、BottomNavigationBar实现的一个简单的项目框架
- 关于Android沉浸式通知栏的一个开源库SystemBarTint简单使用
- 关于Android沉浸式通知栏的一个开源库SystemBarTint简单使用
- 关于Android沉浸式通知栏的一个开源库SystemBarTint简单使用
- Android沉浸式通知栏的一个开源库SystemBarTint简单使用,android沉浸式状态栏
- Java实现一个简单的RPC框架(五) 基于Socket的传输层实现
- SystemBarTint的使用
- 一个简单的rpc框架的实现
- 一个简单的rpc框架的实现
- 基于httpclient的一个简单刷票器实现
- 基于python实现一个简单的神经网络
- 基于Java实现的一个简单计算器
- 基于JAVA集合框架实现一个简单的学生管理系统
- 一个简单androidUI框架的实现
- 自己实现一个简单的RPC框架
- 如何实现一个简单的rpc框架
- 实现一个简单的java集合框架
- Android BottomNavigationBar的使用
- python服务器环境搭建(1)——本地服务器准备
- 第2周 项目3 小试循环
- Java父子类在生成对象时的属性关系
- 《编程之法》:最大连续子数组和
- [Python模块学习]用sndhdr模块识别音频格式
- 基于SystemBarTint、BottomNavigationBar实现的一个简单的项目框架
- mysql创建用户和授予权限
- 超级表格教你怎样“零”成本制作签到系统
- Vitamio多媒体开发框架
- 鸟哥的linux私房菜学习笔记《二十八》PAM模块
- 模拟借书系统
- 496. Next Greater Element I
- log4j的配置
- 关于STM32F4中ADC多通道连续采样的配置