android 关于TabLayout联动ViewPager2 实现底部导航栏

这篇具有很好参考价值的文章主要介绍了android 关于TabLayout联动ViewPager2 实现底部导航栏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在心血来潮想写在app 不过我关于android可以说是0基础 在写底部导航栏的时候去问了大佬才知道TabLayout和ViewPager 花了两天才看懂...

这里只是简单介绍因为我不准备专门做安卓软件所以在学的途中很多地方没有认真记

介绍

本篇文章使用的代码是Java

这里官方是有将两个进行联动的方法的 当然如果不用也可以做 只不过应该没人会这样写...

TabLayout

关于TabLayout给我的第一感觉是真的强大 而大部分情况TabLayout都是用于做导航栏的(也是暂时没想出来还可以做什么)

ViewPager

而ViewPager主要是用于做页面滚动 滑动页面 等

这里页面滚动和滑动页面是两个东西 页面滚动就是类似于在浏览某宝或新闻网站时遇到的滚动效果 页面滑动是用户用手指滑动页面(左滑或右滑) 而这里的滚动是自动的由程序设置定时器的方式滚动 当然也可以手动滑动 页面滑动只是用户用手指去滑动

代码

layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/father_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    tools:context=".Main">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        app:tabGravity="fill"
        app:tabIconTint="@color/tab_layout"
        app:tabIndicatorFullWidth="true"
        app:tabIndicatorGravity="top"
        app:tabIndicatorHeight="2dp"
        app:tabMode="fixed"
        app:tabRippleColor="#ADD8E6"
        app:tabUnboundedRipple="true"/>

</RelativeLayout>

可以看到在我的layout_main文件里我定义TabLayout与ViewPager2

需要注意的是这里的ViewPager2和ViewPager是有区别的 一会介绍

由于我没记住TabLayout的属性所以就放文章给大家了....

TabLayout属性介绍:TabLayout属性介绍

Main.java

package com.javabot.demo;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import android.widget.ImageView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;

import com.daimajia.androidanimations.library.Techniques;
import com.daimajia.androidanimations.library.YoYo;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import com.javabot.demo.fragment.FragmentCommunity;
import com.javabot.demo.fragment.FragmentContact;
import com.javabot.demo.fragment.FragmentDocumentation;
import com.javabot.demo.fragment.FragmentHomePage;
import com.javabot.demo.utils.MyFragmentPagerAdapter;
import com.javabot.demo.utils.svg;

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

/**
 * 主程序
 *
 * @author 白
 */
public class Main extends AppCompatActivity {

    private final Context context = this;

    /**
     * 工具 svg对象
     */
    private final svg svg = new svg(context);

    private int[] tabIconView = {
            R.drawable.home,
            R.drawable.megaphone,
            R.drawable.paper_plane,
            R.drawable.user
    };

    /**
     * 自定义view
     *
     * @param icon svg
     * @return View
     */
    private View setCustomView(int icon) {
        View v = View.inflate(context, R.layout.custom_view, null);
        ImageView i = v.findViewById(R.id.CustomViewImage);
        i.setImageTintList(ContextCompat.getColorStateList(context, R.color.tab_layout));
        i.setImageDrawable(svg.svgImage(icon));
        return v;
    }

    /**
     * TabLayout关联ViewPager2
     */
    private void addMyFragmentPagerAdapter() {
        List<Fragment> fragmentList = new ArrayList<>();

        FragmentHomePage homePage = new FragmentHomePage();
        FragmentCommunity community = new FragmentCommunity();
        FragmentContact contact = new FragmentContact();
        FragmentDocumentation documentation = new FragmentDocumentation(context);

        fragmentList.add(homePage);
        fragmentList.add(community);
        fragmentList.add(contact);
        fragmentList.add(documentation);

        MyFragmentPagerAdapter fragmentAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),getLifecycle(), fragmentList);
        TabLayout tabLayout = findViewById(R.id.navigation);
        ViewPager2 viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(fragmentAdapter);

        new TabLayoutMediator(tabLayout, viewPager,
                (tab, position) -> {
                    tab.setIcon(tabIconView[position]);
                }
        ).attach();

        // 监听页面切换事件
        viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                // 更新TabLayout的选中状态
                tabLayout.selectTab(tabLayout.getTabAt(position));
                tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabUnselected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabReselected(TabLayout.Tab tab) {
                        YoYo.with(Techniques.RubberBand)
                                .duration(700)
                                .playOn(tab.view);
                    }
                });
            }
        });
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);
        addMyFragmentPagerAdapter();
    }
}

主要关联的代码在addMyFragmentPagerAdapter方法中

这里我们将代码一点点拆解介绍

addMyFragmentPagerAdapte方法

这里的代码都是按照addMyFragmentPagerAdapte方法中的代码一行一行的讲解 所以看到不知道的变量时请往上瞅瞅

 List<Fragment> fragmentList = new ArrayList<>();

这里是创建视图存储器的 这个就看各位喜好了 也可以用Map或数组

ViewPager2的视图对象需要是Fragment而不是View 因为适配器需要

关于ViewPager2的详细介绍请移步

ViewPagers2

FragmentHomePage homePage = new FragmentHomePage();
FragmentCommunity community = new FragmentCommunity();
FragmentContact contact = new FragmentContact();
FragmentDocumentation documentation = new FragmentDocumentation(context);
fragmentList.add(homePage);
fragmentList.add(community);
fragmentList.add(contact);
fragmentList.add(documentation);

创建视图对象并添加到集合中 这一步没什么好说的 视图对象会在下面放出来

MyFragmentPagerAdapter fragmentAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),getLifecycle(), fragmentList);

创建适配器对象 适配器会在下面放出来

TabLayout tabLayout = findViewById(R.id.navigation);
ViewPager2 viewPager = findViewById(R.id.view_pager);

获取xml文件中的视图id 这里也没什么好说的

viewPager.setAdapter(fragmentAdapter);

设置ViewPager2适配器fragmentAdapter由适配器对象获得

new TabLayoutMediator(tabLayout, viewPager,
        (tab, position) -> {
            tab.setIcon(tabIconView[position]);
    }).attach();

将TabLayout和ViewPager2关联

而这里的

tab.setIcon(tabIconView[position]);

就是在里面的代码是用于设置TabLayout显示的内容的 这边这个可以自己按需求更改

// 监听页面切换事件
        viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                // 更新TabLayout的选中状态
                tabLayout.selectTab(tabLayout.getTabAt(position));
                tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                    @Override
                    public void onTabSelected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabUnselected(TabLayout.Tab tab) {
                    }

                    @Override
                    public void onTabReselected(TabLayout.Tab tab) {
                        YoYo.with(Techniques.RubberBand)
                                .duration(700)
                                .playOn(tab.view);
                    }
                });
            }
        });

这里就和备注的一样 和平常的监听事件相同这里可写可不写

需要拿出来说的是

 YoYo.with(Techniques.RubberBand)
    .duration(700)
    .playOn(tab.view);

这是一个名叫悠悠球的动画库

这里是官网介绍:YoYo

依赖如下

//悠悠球动画库
implementation 'com.daimajia.androidanimations:library:2.4@aar'

适配器 FragmentStateAdapter对象

package com.javabot.demo.utils;

import static androidx.viewpager.widget.PagerAdapter.POSITION_NONE;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import java.util.List;

/**
 * 适配器对象
 * @author 白
 */
public class MyFragmentPagerAdapter extends FragmentStateAdapter {
    private final List<Fragment> fragmentList;

    public MyFragmentPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragmentList) {
        super(fragmentManager, lifecycle);
        this.fragmentList = fragmentList;
    }

    public MyFragmentPagerAdapter(FragmentActivity fm, List<Fragment> fragmentList) {
        super(fm);
        this.fragmentList=fragmentList;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getItemCount() {
        return fragmentList.size();
    }

    @Override
    public long getItemId(int position) {
        return fragmentList.get(position).hashCode();
    }
}

这里的适配器你需要重写的方法有getItemCount和createFragment

这里也只介绍这两个方法

getItemCount方法

此方法返回的是视图的个数 例如我想要显示4个视图那就返回4 如果我给适配器传的视图有6个或者更多但是这个方法只返回4那也只会显示4个视图

createFragment方法

这个方法返回的是视图而此方法中的参数position 代表当前是哪个视图 返回对应视图的下标(从0开始)

例如我在这个方法中写if判断 position==0 再返回某个视图对象 那他的意思其实就是当用户点击到下标为0的那个选项时(或滑动)当前视图显示的内容就是我这里所返回的视图内容

视图文件 Fragment对象

package com.javabot.demo.fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.javabot.demo.R;

/**
 * 主页视图
 */
public class FragmentHomePage extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.home_page,container,false);
    }
}

剩下的和这个一样就不发出来了

和视图文件所对应的xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="主页"/>

</RelativeLayout>

这里都差不多就不放出来了

效果图

tablayout和viewpager2,android,学习

 文章来源地址https://www.toymoban.com/news/detail-822719.html

 

到了这里,关于android 关于TabLayout联动ViewPager2 实现底部导航栏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android修行手册 - 使用ViewPager2实现画廊效果

    Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总 游戏脚本-辅助自动化 Android控件全解手册 再战Android系列 Scratch编程案例 软考全系列 Unity3D学习专栏 蓝桥系列 ChatGPT和AIGC 专注于 Android/Unity 和各种游戏开发技巧,以及 各种资源分享 (网站、工具、素材、源码、游戏等

    2024年02月22日
    浏览(45)
  • 【Android】使用ViewPager2实现轮播图效果,手动/自动轮播图

    这里使用Gilde进行加载图片:Glide 使用Gilde可以加载网络图片还可以提高图片加载性能。 接下来新建一个子布局item_image,加载viewPage2的子布局。 ViewPage2就是使用recyclerView实现的,所以这里使用方法其实类似。 这里直接继承RecyclerView.Adapter即可,代码很简单不必多说。 创建一个

    2024年02月03日
    浏览(49)
  • Android kotlin 实现仿蜜源ViewPager和指示器对应上面TabLayout功能

    在 app 的 build.gradle 在添加以下代码 1、 TabLayout : implementation \\\'com.google.android.material:material:1.1.0\\\' 2、 implementation \\\'com.github.li-xiaojun:StateLayout:1.3.4\\\' //allprojects {…增加:maven { url ‘https://jitpack.io’ }…} 3、 implementation \\\'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6\\\' ,这个里面带的适配

    2024年02月09日
    浏览(74)
  • Android 使用ViewPager2+ExoPlayer+VideoCache 实现仿抖音视频翻页播放

    1. 实现效果    效果图中,视频没有铺满 是因为使用了ExoPlayer的RESIZE_MODE_FIT模式, 虽然使用RESIZE_MODE_FILL模式可以填充整个父布局,但是本Demo中使用的视频源本身就不适合全屏,会把视频拉伸,效果不好。 抖音上的视频源应该都有严格的宽高尺寸,才能做到全屏有很好的效

    2023年04月09日
    浏览(40)
  • Android:ViewPager2

    ViewPager2内部使用RecyclerView实现,并提供了增强功能 支持水平、垂直方向布局 android:orientation = “vertical” 支持从右到左 android:layoutDirection = “rtl” 禁止滑动 setUserInputEnabled() 可修改Fragment集合 对可修改的Fragment集合进行分页浏览,底层集合更改时调用notifyDatasetChanged来更新页

    2024年02月09日
    浏览(39)
  • Android进阶之路 - ViewPager2 比 ViewPager 强在哪?

    我记得前年(2022)面试的时候有被问到 ViewPager 和 ViewPager2 有什么区别?当时因为之前工作一直在开发售货机相关的项目,使用的技术要求并不高,所以一直没去了解过 ViewPager2~ 去年的时候正好有相关的功能需求,索性直接用 ViewPager2 进行了 Tip :很多人可能比较关注俩者区

    2024年02月20日
    浏览(51)
  • 【Android基础面试题】ViewPager与ViewPager2的区别

    ViewPager和ViewPager2是Android中用于实现滑动页面切换的控件。它们的主要区别如下: 实现方式 ViewPager2的内部实现是RecyclerView,而ViewPager是通过继承自ViewGroup实现的。因此,ViewPager2的性能更高。 滑动方向 ViewPager2可以实现横向和竖向滑动,而ViewPager只能横向滑动。 Adapter:View

    2024年02月11日
    浏览(45)
  • 『Android基础入门』ViewPager+Fragment+BottomNavigationView实现底部导航

    👨‍🎓作者简介:一位喜欢写作,计科专业大三菜鸟 🏡个人主页:starry陆离 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 在ViewPager与Fragment结合实现多页面滑动的学习上再进一步,记录一下ViewPager+Fragment+BottomNavigationView实现底部导航 1.复习ViewPager的用法 2.复习F

    2023年04月08日
    浏览(47)
  • android : 底部导航栏的实现(使用ViewPager和BottomNavigationView)

      本案例中需要用的控件ViewPager和BottomNavigationView ViewPager:主要是页面的切换 Fragment:碎片(也就是每个页面的内容) BottomNavigationView:底部导航栏 非常简单,主要就是一个Viewpager和BottomNavigationView 先来说一下思路:BottomNavigationView底部导航栏   ViewPager+Fragment页面        

    2024年02月03日
    浏览(41)
  • Android studio中使用ViewPager和BottomNavigationView实现底部导航栏和碎片的同步切换

    通过几次的踩雷和摸索,完成了以上的操作,本教程写的详细全面,包教包会,对新手有好,看了不会的联系我,我倒立洗头给你看。 所需控件: fragment 作为Android中最常用的控件,它有自己的声明周期,可以粗略地等比为能够分屏的activity,但是和activity有区别,fragment有自

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包