Android:BottomNavigationView设置noActionbar主题后闪退的解决方法,以及另外两种实现方法
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的实现。
更多相关文章
- 其实android也可以使用jetty的comet客户端
- Android(安卓)初学者第一步 Activity生命周期
- Android(安卓)项目实战视频资料 学习充电必备
- Android程序反编译的方法[已更新]
- Android(安卓)studio 入门教程(案例)
- Android(安卓)studio导入eclipse项目
- LinuxMint下让adb工具识别android设备
- android 页面初始化时让组件得不到焦点
- android系统工具之 draw9patch超详细教程