写这个不是为了什么,仅仅是为了督促自己学习,进步。效果图:
就是这样一个简单的不能再简单的框架,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();
还用解释么?一眼就看懂了,注释写这么清楚。
432

被折叠的 条评论
为什么被折叠?



