Android Studio自带的BottomNavigationView项目设置了noActionbar这个主题就会闪退
原因是Android Studio自带的BottomNavigationView项目使用了Jetpack的Navigation做为页面的切换工具,每切换一次Fragment就会设置一次toobar的title,因此如果设置了noActionbar这个主题,就会因为Fragment设置title时找不到toobar而闪退
不设置noActionbar的话就无法使用toolbar,蛋疼。
下面我会介绍两种BottomNavigationView的实现方法:
一种是Android Studio自带的项目实现,使用Jetpack的Navigation做为页面的切换工具,以及说明为什么自带的基础模板不能设置noActionbar的原因
(如果你对Android Studio自带的BottomNavigationView实现不敢兴趣,或是不熟悉Android Jetpack,请直接看第二种实现方式,因为目前自带的BottomNavigationView还是实现不了设置noActionbar主题)
另一种是BottomNavigationView + viewPage( 使用viewPage做为页面切换工具)的实现方法
先看一下两者的实现效果对比
使用Android Studio自带的项目实现(Navigation做为页面的切换工具):
(不能滑动切换,切换效果为淡入淡出)
BottomNavigationView + viewPage( 使用viewPage做为页面切换工具):
(可以滑动切换,切换效果为左右位移)
1 使用Android自带的BottomNavigationView项目:
1.1 首先创建一个自带的BottomNavigationView项目,然后看一下目录结构:
1.2 很明显这是一个基于jetpack的项目,其中meun用来保存底部item的布局文件:
meun中的代码:
对应位置:
1.3 看一下navigation中的布局
或许现在看这些好像没什么用,待会看mainactivity中的代码实现你就知道了
1.4 看一下mainActivity中的代码是如何实现BottomNavigationView页面切换的:
到这里就明了了,Android Studio帮我们创建的是使用Navigation来作为切换页面工具的BottomNavigationView项目,但是Navigation作为Jetpack中的一员,才刚刚出来没多久,难免会有些不足之处。
不能设置noActionbar的问题就在于Navigation有一项默认设置,是把当前Fragment标题设置成actionBar的title,要是把ActionBar去掉了,它就会因为找不到ActionBar而报错,然后闪退,所以到目前为止,想要用noActionbar主题,还是需要用viewPage作为页面切换工具…
2 使用viewPage作为页面切换工具来实现BottomNavigationView的切换(当然也可以使用viewPage2,viewPage的升级版2019年的,有兴趣的同学可以看看)
2.1 首先我们需要为viewPage设置一个adapter适配器,下面是模板:
/**
* viewPage初始化
* 获取viewPager,并为其设置适配器
*/
private void initViewPage() {
viewPager = findViewById(R.id.viewpage);
viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
@NonNull
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
/**
*页面选中判断,当到达指定position时,返回position对应的页面
*/
switch ( position ){
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new GoodsClassFragment();
break;
case 2:
fragment = new ShopCatFragment();
break;
case 3:
fragment = new PersonCenterStart();
break;
}
assert fragment != null;
return fragment;
}
/**
*这里需要填写总的页面数量
*/
@Override
public int getCount() {
return 4;
}
});
//viewPager滑动事件监听
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
bottomNavigationView.getMenu().getItem(position).setChecked(true);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
2. 我们需要为BottomNavigationView设置item选择监听事件,下面是模板
/**
* 底部导航栏初始化
*/
private void initBottomNav() {
bottomNavigationView = findViewById(R.id.bv);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
/**
*当点击到菜单中的item时,调用viewPage中的setCurrentItem方法切换到对应界面
*/
switch ( item.getItemId() ){
case R.id.navigation_home:
viewPager.setCurrentItem(0);
break;
case R.id.navigation_goodsClass:
viewPager.setCurrentItem(1);
break;
case R.id.navigation_shopCat:
viewPager.setCurrentItem(2);
break;
case R.id.navigation_personalCenter:
viewPager.setCurrentItem(3);
break;
}
return false;
}
});
}
3. 之后在onCreate中执行即可:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//状态栏文字自适应
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
initViewPage();
initBottomNav();
}
这样我们就完成了一个viewPage+BottomNavigationView的实现。