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的实现。

更多相关文章

  1. 其实android也可以使用jetty的comet客户端
  2. Android(安卓)初学者第一步 Activity生命周期
  3. Android(安卓)项目实战视频资料 学习充电必备
  4. Android程序反编译的方法[已更新]
  5. Android(安卓)studio 入门教程(案例)
  6. Android(安卓)studio导入eclipse项目
  7. LinuxMint下让adb工具识别android设备
  8. android 页面初始化时让组件得不到焦点
  9. android系统工具之 draw9patch超详细教程

随机推荐

  1. android string.xml文件中的整型和string
  2. Android的桌面上的应用介绍
  3. Android(安卓)RxJava 实战系列:优雅实现
  4. 百度ting!正式发布beta版Android手机客户
  5. Android(安卓)重学系列 资源管理系统 资
  6. Android组件间的交互和进程间IPC通信
  7. Android(安卓)自带的DownloadManager 在S
  8. 来了!真Material Design版的玩Android
  9. 宏锦软件 Android(安卓)的 ListView 使用
  10. Android之Notification的多种用法实例