首页 > 其他分享 >ViewPager+Fragment+BottomNavigationView实现底部导航

ViewPager+Fragment+BottomNavigationView实现底部导航

时间:2023-03-28 16:35:33浏览次数:39  
标签:Fragment ViewPager public break menu mFragmentList import BottomNavigationView i

昨天我学习了ViewPager+Fragment+BottomNavigationView实现底部导航并将其应用在我的地铁app中。

这种底部导航就是最常见的手机app 的导航形式,典型例子就是微信。

效果展示:

我们可以看到,我们可以左右滑动切换页面,同时也能点击底部导航栏实现切换,并且两者是同步的。

 

 具体实现就是要用到 ViewPager+Fragment+BottomNavigationView

1.我们首先要准备好我们的三个fragment,用来做三个主要功能的页面,我已经准备好了:

 

 2.然后创建ViewPager的适配器,这里我们要结合Fragment,因此我们要用到的就不是 PagerAdapter了,

这里我们需要继承  androidx.fragment.app.FragmentPagerAdapter。

package com.example.dataapplication.adapter;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;

import java.util.List;

public class MyFragStateAdapter extends FragmentStatePagerAdapter {

    private List<Fragment> mFragmentList;

    public MyFragStateAdapter(@NonNull FragmentManager fm,List<Fragment> fragmentList) {
        super(fm);
        this.mFragmentList =fragmentList;

    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return mFragmentList == null ? null : mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList == null ? 0 : mFragmentList.size();
    }
}

3.然后再在activity中重写两个方法。

我们首先要将我们需要的东西都声明一下:

   private ViewPager mViewPager;
    private BottomNavigationView mBottomNavigationView;
    private MyFragStateAdapter FragStateAdapter;
    private List<Fragment> mFragmentList;

然后重写下面的两个方法:

menu_1
menu_2
menu_3
分别是三个菜单的控件
mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                switch (item.getItemId()){
                    case R.id.menu_1:
                        mViewPager.setCurrentItem(0);
                        break;
                    case R.id.menu_2:
                        mViewPager.setCurrentItem(1);
                        break;
                    case R.id.menu_3:
                        mViewPager.setCurrentItem(2);
                        break;
                    default:
                        break;
                }
                return true;
            }
        });

还有:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
           @Override
           public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

           }

           @Override
           public void onPageSelected(int position) {
               switch (position){
                   case 0:
                       mBottomNavigationView.setSelectedItemId(R.id.menu_1);
                       break;
                   case 1:
                       mBottomNavigationView.setSelectedItemId(R.id.menu_2);
                       break;
                   case 2:
                       mBottomNavigationView.removeBadge(R.id.menu_3);
                       mBottomNavigationView.setSelectedItemId(R.id.menu_3);
                       break;
                   default:
                       break;
               }
           }

           @Override
           public void onPageScrollStateChanged(int state) {

           }
       });

最后把需要的三个fragment放入mFragmentList供ViewPager使用

private void initData() {
        mFragmentList = new ArrayList<>();

        SearchFragment fragment1 = SearchFragment.newInstance("","");
        LeftListFragment fragment2 = LeftListFragment.newInstance("","");
        MapFragment fragment3 = MapFragment.newInstance("","");

        mFragmentList.add(fragment1);
        mFragmentList.add(fragment2);
        mFragmentList.add(fragment3);
    }

完整代码:

package com.example.dataapplication;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;

import com.example.dataapplication.OtherActivity.DynamicFragmentActivity;
import com.example.dataapplication.adapter.MyFragStateAdapter;
import com.example.dataapplication.fragment.BlankFragment2;
import com.example.dataapplication.fragment.frag1.SearchFragment;
import com.example.dataapplication.fragment.frag2.LeftListFragment;
import com.example.dataapplication.fragment.frag3.MapFragment;
import com.google.android.material.badge.BadgeDrawable;
import com.google.android.material.bottomnavigation.BottomNavigationView;

import java.util.ArrayList;
import java.util.List;

public class PagerActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private BottomNavigationView mBottomNavigationView;
    private MyFragStateAdapter FragStateAdapter;
    private List<Fragment> mFragmentList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pager);

        mViewPager = findViewById(R.id.vp2);
        mBottomNavigationView = findViewById(R.id.bottom_menu);
        
        initData();
        FragStateAdapter = new MyFragStateAdapter(getSupportFragmentManager(),mFragmentList);
        mViewPager.setAdapter(FragStateAdapter);

       mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {

                switch (item.getItemId()){
                    case R.id.menu_1:
                        mViewPager.setCurrentItem(0);
                        break;
                    case R.id.menu_2:
                        mViewPager.setCurrentItem(1);
                        break;
                    case R.id.menu_3:
                        mViewPager.setCurrentItem(2);
                        break;
                    default:
                        break;
                }
                return true;
            }
        });

       mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
           @Override
           public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

           }

           @Override
           public void onPageSelected(int position) {
               switch (position){
                   case 0:
                       mBottomNavigationView.setSelectedItemId(R.id.menu_1);
                       break;
                   case 1:
                       mBottomNavigationView.setSelectedItemId(R.id.menu_2);
                       break;
                   case 2:
                       mBottomNavigationView.removeBadge(R.id.menu_3);
                       mBottomNavigationView.setSelectedItemId(R.id.menu_3);
                       break;
                   default:
                       break;
               }
           }

           @Override
           public void onPageScrollStateChanged(int state) {

           }
       });


    }

    private void initData() {
        mFragmentList = new ArrayList<>();

        SearchFragment fragment1 = SearchFragment.newInstance("","");
        LeftListFragment fragment2 = LeftListFragment.newInstance("","");
        MapFragment fragment3 = MapFragment.newInstance("","");

        mFragmentList.add(fragment1);
        mFragmentList.add(fragment2);
        mFragmentList.add(fragment3);
    }
}

 

标签:Fragment,ViewPager,public,break,menu,mFragmentList,import,BottomNavigationView,i
From: https://www.cnblogs.com/rsy-bxf150/p/17265726.html

相关文章

  • Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
    Toolbar作为ActionBar使用介绍本文介绍了在Android中将Toolbar作为ActionBar使用的方法.并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为ActionBar使用时需要注意的......
  • Fragmentation merging-填坑dp
    D.Fragmentationmerginghttps://codeforces.com/gym/103104/problem/D题意给定一个长度为n(\(n<=5e3\))的排列每次操作可以选择两个不相交的区间,如果两个区间并起来的......
  • ParallaxViewPager:ViewPager的视差背景效果
    这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!所谓......
  • 今日共同报告-13-app底部导航栏的实现,fragment传参
    今日共同报告-13今天时间比较充沛,学了许多东西,主要是fragment传参,同时把底部导航栏完成了。目前进度的页面展示:能够实现点击切换和选中的选项颜色变化  部分代码:......
  • Activity通过Argument向Fragment传递数据
    今天又学了Activity通过Argument向Fragment传递数据,这种方式是安卓给我们提供的,相比与用方法传递,它能传递更多的数据,更加常用。Argument传递数据需要使用Bundle容器,传递的......
  • Activity通过构造方法和普通方法向Fragment传递参数
    今天学习了Activity通过构造方法和普通方法向Fragment传递参数这种方式的缺点是传递数据量较少看一下效果:  代码实现:这里示例了两种方法,一个是用构造方法,一个是普......
  • Fragment-更进一步
    Fragment是什么Fragment可以做到把屏幕划分成几块,然后进行分组,进行模块化的管理。并且可以更加方便的在运行过程中动态地更新Activity的用户界面Fragment并不能单独使用......
  • ViewPager引导页根据滑动渐变背景色
    1、主要依赖:compile'com.android.support:support-v4:25.1.0'compile'com.jaeger.statusbaruitl:library:1.3.6'状态栏依赖包使用非常方便,并且作者对4.4的版本做了适配......
  • 控制台Problems提示:Duplicated code fragment (12 lines long)
      代码段里有黄色的波浪线翻译过来就是"重复的代码片段(12行)",这是pycharm提示你在同一个项目中存在相同的代码片段,也是间接性提醒你优化自己的代码,不想提示黄色的波浪......
  • 碎片 Fragment - 静态注册
    新建一个activity,命名为FragmentStaticActivity,如下publicclassFragmentStaticActivityextendsActivity{privatestaticfinalStringTAG="FragmentStaticAc......