今天朋友问了我BottomNavigationBar嵌套fragment重复加载的问题,我以前处理过fragment重复加载,但是突然间忘了,这可能就是不写博客的坏处吧,没有记忆。BottomNavigationBar也是我第一次接触,所以写篇文章增强下记忆。
BottomNavigationBar是谷歌去年3月份推出的MD风格的导航栏控制器。先看看官方给的效果图吧
感觉还是挺好看的
在此我就上传代码了,简单说下
1.如何使用
gradle 中引用 compile 'com.ashokvarma.android:bottom-navigation-bar:1.2.0'
2.那就开始代码吧
2.1 xml 文件中引用
<FrameLayout
android:id="@+id/mFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.ashokvarma.bottomnavigation.BottomNavigationBar
android:id="@+id/bottom_navigation_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
2.2在Activity类中实现BottomNavigationBar.OnTabSelectedListener然后生成
public void onTabSelected(int position) {
// 点击Item时调用此方法
}
@Override
public void onTabUnselected(int position) {
// 对没有选中的Item进行处理的方法,
}
@Override
public void onTabReselected(int position) {
// 当被选中的Item 再一次被点击时调用此方法
}
2.3在activity中的使用
BottomNavigationBar bottomNavigationBar = (BottomNavigationBar) findViewById(R.id.bottom_navigation_bar);
//设置模式(MODE_DEFAULT:如果Item的个数<=3就会使用MODE_FIXED模式,否则使用MODE_SHIFTING模式。MODE_FIXED 是填充模式,未选中的Item会显示文字,没有移位动画。MODE_SHIFTING:
//移位模式,未选中的Item不会显示文字,选中的会显示文字。在切换的时候会有一个像移位的动画)
bottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
//设置背景样式( BACKGROUND_STYLE_STATIC 点击的时候没有水波纹效果,BACKGROUND_STYLE_RIPPLE 点击的时候有水波纹效果,如果设置的Mode为MODE_FIXED,将使用BACKGROUND_STYLE_STATIC 。如果Mode为MODE_SHIFTING将使用BACKGROUND_STYLE_RIPPLE。)
bottomNavigationBar
.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC
);
// 添加Item,设置选中的Item,初始化
bottomNavigationBar.addItem(new BottomNavigationItem(R.mipmap.ic_home_white_24dp, "Home").setActiveColorResource(R.color.orange))
.addItem(new BottomNavigationItem(R.mipmap.ic_book_white_24dp, "Books").setActiveColorResource(R.color.teal))
.addItem(new BottomNavigationItem(R.mipmap.ic_music_note_white_24dp, "Music").setActiveColorResource(R.color.blue))
.addItem(new BottomNavigationItem(R.mipmap.ic_videogame_asset_white_24dp, "Games").setActiveColorResource(R.color.grey))
.setFirstSelectedPosition(0)
.initialise();
fragments = getFragments();
//设置默认的Item
setDefaultFragment();
//监听实现的方法
bottomNavigationBar.setTabSelectedListener(this);
2.4设置默认的item
/**
* 设置默认的Item
*/
private void setDefaultFragment() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.layFrame, HomeFragment.newInstance("Home"));
transaction.commit();
}
2.5将实例化Fragment放入数组
private ArrayList<Fragment> getFragments() {
ArrayList<Fragment> fragments = new ArrayList<>();
fragments.add(HomeFragment.newInstance("Home"));
fragments.add(BookFragment.newInstance("Books"));
fragments.add(MusicFragment.newInstance("Music"));
fragments.add(GameFragment.newInstance("Games"));
return fragments;
}
2.6在实现方法里进行切换fragment
public void onTabSelected(int position) {
if (fragments != null) {
if (position < fragments.size()) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
//当前的fragment
Fragment from = fm.findFragmentById(R.id.layFrame);
//点击即将跳转的fragment
Fragment fragment = fragments.get(position);
if (fragment.isAdded()) {
// 隐藏当前的fragment,显示下一个
ft.hide(from).show(fragment);
} else {
/ 隐藏当前的fragment,add下一个到Activity中
ft.hide(from).add(R.id.layFrame, fragment); /
}
ft.commitAllowingStateLoss();
}
}else {
// 隐藏当前的fragment,add下一个到Activity中
ft.hide(from).add(R.id.layFrame, fragment);
if (fragment.isHidden()) {
ft.show(fragment);
Logger.d("被隐藏了");
}
}
}
@Override
public void onTabUnselected(int position) {
//这儿也要操作隐藏,否则Fragment会重叠
if (fragments != null) {
if (position < fragments.size()) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = fragments.get(position);
// 隐藏当前的fragment
ft.hide(fragment);
ft.commitAllowingStateLoss();
}
}
}
@Override
public void onTabReselected(int position) {
}
好了,核心代码就这么多了,下边是效果图
如果有什么问题给我留言吧,欢迎给我指错。。。
感谢相公无爱的纠错,已改正