android ViewPager + Fragment + Tablayout 实现嵌套页面导航(二)

简介: android ViewPager + Fragment + Tablayout 实现嵌套页面导航

3、创建适配器

为什么要创建适配器?

     适配器作用是把每个单独的fragment页面放在一起打包,传给ViewPager。只有ViewPager设置了适配器我们才能看见翻页的效果。

所以我们要单独写一个类并继承 FragmentPagerAdapte


Alt + Enter 主要实现 FragmentPagerAdapter 方法和构造方法


MyFragmentStateVPAdapter  构造方法,用来接收参数

getItem 根据position来获取页面

getCount 获取页面的个数

   基本方法都实现完后,我们要定义一个变量来存储我们每个fragment子页面

private List<Fragment> myFragmentList;

定义变量 myFragmentList 后,我们需要在构造方法内赋值,并在getItem 和getCount 方法进行操作,具体看下面代码

MyFragmentStateVPAdapter

package com.example.tabfragment.adapter;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class MyFragmentStateVPAdapter extends FragmentPagerAdapter {
    private List myFragmentList;
    public MyFragmentStateVPAdapter(@NonNull FragmentManager fm,List myFragmentList) {
        super(fm);
        this.myFragmentList = myFragmentList;
    }
    /**
     * 获取页面
     * @param position  页面的位置
     * @return 返回具体页面
     */
    @NonNull
    @Override
    public Fragment getItem(int position) {
        return myFragmentList == null ? null:myFragmentList.get(position);
    }
    /**
     * 获取adapter内存储的页面个数
     * @return
     */
    @Override
    public int getCount() {
        return myFragmentList == null ? 0 : myFragmentList.size();
    }
}

4、在 Activity_index 内整合

第一步:先确认变量确认变量

 

private ViewPager mViewPager; // 主页面来展示子页面 Viewpager
    private BottomNavigationView mBottomNavigationView; //主页面底部tab按钮
    private List mFragmentList; //存储fragment页面,用来作为构造adapter的参数
    private MyFragmentStateVPAdapter mStateVPAdapter;

第二步: 获取控件

private void initeView() {
        mViewPager = findViewById(R.id.vp);
        mBottomNavigationView = findViewById(R.id.bottom_nav_menu);
    }

第三步:准备fragment页面

       因为我们要在ViewPage内滑动显示多个页面,所以我们要先把这几个页面创建好,存储到 mFragmentList,为下一步显示页面做准备

private void initData() {
        mFragmentList = new ArrayList<>();
        VPFragment homeFragment = VPFragment.newInstance("首页", R.drawable.ji1);
        VPFragment recommendFragment = new VPFragment().newInstance("推荐",R.drawable.ji5);
        VPFragment mineFragment = new VPFragment().newInstance("我的",R.drawable.ji6);
        //添加页面
        mFragmentList.add(homeFragment);
        mFragmentList.add(recommendFragment);
        mFragmentList.add(mineFragment);
    }

第四步:创建适配器,并设置监听 (页面绑定底部按钮)

我们把上一步创建好的fragment页面,作为参数来构造适配器

new MyFragmentStateVPAdapter(getSupportFragmentManager(), mFragmentList )

第一个参数:getSupportFragmentManager() 这个大家记着就可以了,固定用法


第二个参数: mFragmentList


    然后让mViewPager 设置该适配器,调用setAdapter() 方法


     接下来,让给mViewPager设置监听,调用addOnPageChangeListener(),目的是让mViewPager内的子页面与底部menu按钮相关联。

private void setFListener() {
        mStateVPAdapter = new MyFragmentStateVPAdapter(getSupportFragmentManager(),mFragmentList);
        mViewPager.setAdapter(mStateVPAdapter);
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
            @Override
            public void onPageSelected(int position) {onPagerSelected(position);}
            @Override
            public void onPageScrollStateChanged(int state) {}
        });
    }

 这里我把页面绑定底部按钮的代码提取出来了,方便大家查看。


 这里我们设置监听会返回翻页面的位置,然后在该页面下绑定对于的按钮mBottomNavigationView调用 setSelectedItemId方法,传入的参数是menu内每个item的id值


//给每个页面设置按钮,页面关联按钮,页面动,按钮动
    private void onPagerSelected(int position) {
        switch(position){
            case 0:
                mBottomNavigationView.setSelectedItemId(R.id.menu_home);
                break;
            case 1:
                mBottomNavigationView.setSelectedItemId(R.id.menu_recommend);
                break;
            case 2:
                mBottomNavigationView.setSelectedItemId(R.id.menu_mine);
                break;
        }
    }

第五步:设置监听(底部按钮绑定页面)

我们还要给底部按钮设置监听(按哪个按钮,跳到对于的页面)

//反向处理,按钮设置点击事件,按钮关联页面
    private void setBListener() {
        mBottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch(item.getItemId()){
                    case R.id.menu_home:
                        mViewPager.setCurrentItem(0);
                        break;
                    case R.id.menu_recommend:
                        mViewPager.setCurrentItem(1);
                        break;
                    case R.id.menu_mine:
                        mViewPager.setCurrentItem(2);
                        break;
                }
                return true;
            }
        });
    }

第六步:在onCreate方法内调用以上方法

调用以上方法并允许,结果如下

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index);
        initeView();
        initData();
        setFListener();
        setBListener();
    }

5、对“首页”字页面重新设置

    在开头我们会发现,“首页”对应的子页面并不只是显示一个图片,而是tab栏+四个fragment,所以我们要重新准备一个fragment类和一个新的适配器。



第一步:给子 fragment(“首页”)写一个适配器

       因为新的页面顶部到导航栏有标题,所以我们要重新再写一个适配器,实现getPageTitle()方法。

getPageTitle方法用来返回每个页面的标题

package com.example.tabfragment.adapter;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import java.util.List;
public class MyFragmentStVpTitleAdapter extends FragmentStatePagerAdapter {
    private List mFragmentList;
    private List titleList;
    public MyFragmentStVpTitleAdapter(@NonNull FragmentManager fm,
                                      List mFragmentList,
                                      List titleList) {
        super(fm);
        this.mFragmentList = mFragmentList;
        this.titleList = titleList;
    }
    @NonNull
    @Override
    public Fragment getItem(int position) {
        return mFragmentList == null ? null:mFragmentList.get(position);
    }
    @Override
    public int getCount() {
        return mFragmentList==null? 0:mFragmentList.size();
    }
    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position);
    }
}

第二步:构造VPHomeFragment 类

  构造VPHomeFragment 类 跟 构造 VPfragment 的步骤是一样的,唯一不同就VPHomeFragment 类中多了一个 onCreateView 方法。

   首先,VPHomeFragment 类要添加几个变量

private ViewPager mViewPager;
    private TabLayout mTabLayout;
    private List mFragmentList;
    private List titleList;
    private MyFragmentStVpTitleAdapter mStVPTitleAdapter;
onCreateView 方法 
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mViewPager =  view.findViewById(R.id.home_vp);
        mTabLayout = view.findViewById(R.id.tab_layout);
        initData();
        //注意此处,getChild 嵌套
        mStVPTitleAdapter = new MyFragmentStVpTitleAdapter(getChildFragmentManager(),mFragmentList,titleList);
        mViewPager.setAdapter(mStVPTitleAdapter);
        mTabLayout.setupWithViewPager(mViewPager);//tab 适配页面
    }
    private void initData() {
        mFragmentList = new ArrayList<>();
        VPFragment vPfragment1 = VPFragment.newInstance("鸡",R.drawable.ji1);
        VPFragment vPfragment2 = VPFragment.newInstance("你",R.drawable.ji2);
        VPFragment vPfragment3 = VPFragment.newInstance("太",R.drawable.ji3);
        VPFragment vPfragment4 = VPFragment.newInstance("美",R.drawable.j4);
        mFragmentList.add(vPfragment1);
        mFragmentList.add(vPfragment2);
        mFragmentList.add(vPfragment3);
        mFragmentList.add(vPfragment4);
        titleList = new ArrayList<>();
        titleList.add("鸡");
        titleList.add("你");
        titleList.add("太");
        titleList.add("美");
    }

布局  

为了让首页实现下面效果,我们要对VPHomeFragment 类调用的xm文件重新布局

fragment_v_p_home.xml

android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
        android:id="@+id/home_vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

最后在Activity_index.java 内把 homeFragment类型修改为 VPHomeFragment

VPHomeFragment homeFragment = VPHomeFragment.newInstance("我的",R.drawable.ji1);

gitte获取代码:点击跳转  

相关文章
|
16天前
|
Android开发 开发者 容器
android FragmentManager 删除所有Fragment 重建
通过本文,我们详细介绍了如何使用 `FragmentManager`删除所有Fragment并重建。通过理解和应用这些步骤,可以在实际开发中更灵活地管理Fragment,满足各种应用场景的需求。希望本文能帮助开发者更好地掌握Fragment管理技巧,提高应用开发效率和代码质量。
25 8
|
5月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
45 3
|
7月前
|
Android开发
Android使用ViewPager做无限轮播,人为滑动时停止
Android使用ViewPager做无限轮播,人为滑动时停止
116 2
|
9月前
|
编解码 Android开发
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
165 0
|
9月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
78 3
|
10月前
|
XML 存储 Android开发
Android技能树 — Fragment总体小结,2024年最新腾讯面试gm
Android技能树 — Fragment总体小结,2024年最新腾讯面试gm
|
XML Android开发 数据格式
Android跳转应用安装页面
一.低版本跳转方式 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri,"application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivityForResult(intent, 666); uri是apk的uri。
1845 0
|
安全 Android开发
Android O 8.0,版本升级不跳转应用安装页面的完美解决
最近开发遇到了个问题,app升级的时候,其他手机都能正常升级,下载完安装包,跳到安装页面进行新版本的安装。但却有用户反映,华为P10和华为Mate 9升级时,怎么也无法跳转到安装页面。
1639 0
|
24天前
|
安全 Android开发 iOS开发
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
|
1月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
65 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    Android实战经验之Kotlin中快速实现MVI架构
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    66
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    42
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    42
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    46
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    158
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    55
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    73
  • 9
    Android历史版本与APK文件结构
    183
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    54