Android:BottomNavigationView设置noActionbar主题后闪退的解决方法,以及另外两种实现方法

26 篇文章 1 订阅
11 篇文章 0 订阅

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

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值