最近在重构dileber android框架,为了更好的适应新时代的手机,新出的框架,最低支持android 4.0版本。框架也采用gradle。基本的方法都和之前的框架有了很大不同。增加了很多实用的工具类。
今天不对框架的功能做讲解(后续完成框架再进行讲解)。主要是对fragment的正确使用来讲解:
新框架地址ndileber框架
今天主要使用到的是框架中的一个工具类,底部菜单导航栏。
效果特写:
菜单的源码在这里菜单源码
下面我就开始在activity中使用这个菜单了。
首先activity 继承baseActivity
之后我便在oncreate 方法中写代码了。
如下
private List<Fragment> list = new ArrayList<>();
BottomBar mBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mBar= getView(R.id.bar);
//由于我采用字体图标库,实际上R.string.home2就是上图中的小房子图标,字体图标库,参照这篇文章[字体图标讲解](http://blog.csdn.net/s297165331/article/details/50616338 "字体图标讲解") 新框架与旧框架用法相同
mBar.addItem(new BottomBarTab(this,R.string.home2,BottomBarTab.TYPE_FONT)).
addItem(new BottomBarTab(this,R.string.bubbles,BottomBarTab.TYPE_FONT)).
addItem(new BottomBarTab(this,R.string.newspaper,BottomBarTab.TYPE_FONT)).
addItem(new BottomBarTab(this,R.string.cogs,BottomBarTab.TYPE_FONT));
mBar.setOnClickItemMenu(new BottomBar.OnClickItemMenu() {
@Override
public void onClickItem(int nowPosition,int position) {
switchContent(list.get(nowPosition),list.get(position));
}
});
addMenu(savedInstanceState);
}
addmenu是方法的关键,上面只是阐述菜单的生成,不多做讲解:
private void addMenu(Bundle savedInstanceState){
HomeItemFragment homeItemFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.homeFrame,HomeItemFragment.newInstance(3));
MessageFragment messageFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.messageFrame,MessageFragment.newInstance("1","2"));
ConsultFragment consultFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.consultFrame,ConsultFragment.newInstance("2","3"));
SettingFragment settingFragment = ActivityUtils.getFragment(getSupportFragmentManager(),R.id.settingFrame,SettingFragment.newInstance("4","5"));
list.add(homeItemFragment);
list.add(messageFragment);
list.add(consultFragment);
list.add(settingFragment);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.hide(messageFragment).hide(consultFragment).hide(settingFragment).commit();
if(savedInstanceState!=null){
mBar.setCurrentItem(savedInstanceState.getInt(SELECT));
}
}
addMenu中用到了activityutil类,这个是获取fragment的关键方法:
activityUtils
方法解释如下:
//首先对fragment进行判空,就不解释了,之后先对fragment判断是否存在,如果存在的话就进行复用,(你可能有如下问题:为什么呢?明明写到oncreate中,为什么还要判断呢?)。比如说当前页面进行屏幕横竖操作,这时候就发生了一点问题,fragment重叠了(oncreate执行了,原来拥有的fragment依然存在),所以会出现重叠现象。我在看别人博客的时候发现有很多的博客写的有问题,有些博客甚至去修改onSaveInstanceState和onRestoreInstanceState方法,写法并不是很完美。我如下的写法,一方面是可以解决重叠问题,另一方面构建出的工具类可以直接在代码中使用~
public static <T extends Fragment>T getFragment(@NonNull FragmentManager fragmentManager,@NonNull int fragmentId,@NonNull T myFragment){
Check.checkNotNull(fragmentManager);
Check.checkNotNull(fragmentId);
Check.checkNotNull(myFragment);
T fragment = (T)fragmentManager.findFragmentById(fragmentId);
if (fragment == null) {
fragment = myFragment;
addFragmentToActivity(fragmentManager, fragment,fragmentId);
}
return fragment;
}
切换菜单的方法
public void switchContent(Fragment from, Fragment to) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
}
上面是一个menu的创建与使用方法,目前我在开发一个项目,去整合框架中的使用例子。后期会把源码放在我的github上项目例子