Android中TabLayout结合ViewPager实现页面切换

yizhihongxing

下面我就为您详细讲解“Android中TabLayout结合ViewPager实现页面切换”的完整攻略。

1. 准备工作

在进行具体实现之前,我们需要进行一些准备工作:

  1. 添加相关依赖库,在build.gradle文件中加入以下依赖:

groovy
implementation 'com.google.android.material:material:1.3.0'

这里我们使用了Google的material库,包含了TabLayout以及ViewPager等控件。

  1. 在布局文件中添加TabLayout和ViewPager控件。

2. 实现过程

2.1 创建Fragment

我们需要先创建4个Fragment用于作为ViewPager的子页面,可以通过右键新建一个Blank Fragment来创建。

2.2 创建PagerAdapter

接着我们需要创建一个PagerAdapter来提供ViewPager的显示内容,内容就是我们刚刚创建的4个Fragment。

class MyPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {

    private val fragments = listOf(HomeFragment(), CategoryFragment(), CartFragment(), MineFragment())

    // 获取指定位置的Fragment
    override fun getItem(position: Int): Fragment {
        return fragments[position]
    }

    // 获取页面数量
    override fun getCount(): Int {
        return fragments.size
    }

    // 获取指定页面的标题
    override fun getPageTitle(position: Int): CharSequence? {
        return when (position) {
            0 -> "首页"
            1 -> "分类"
            2 -> "购物车"
            3 -> "我的"
            else -> ""
        }
    }
}

2.3 初始化TabLayout

在Activity或Fragment中获取TabLayout实例并进行初始化。

val tabLayout = findViewById<TabLayout>(R.id.tab_layout)
tabLayout.setupWithViewPager(viewPager)
tabLayout.tabMode = TabLayout.MODE_FIXED

其中,setupWithViewPager方法会自动设置TabLayout的标题,而tabMode则用于设置标签的呈现模式。这里我们使用的是MODE_FIXED,表示标签数量不超过屏幕宽度,一直占据屏幕宽度。

2.4 填充ViewPager

接着我们需要将PagerAdapter与ViewPager控件进行关联。

val viewPager = findViewById<ViewPager>(R.id.view_pager)
val pagerAdapter = MyPagerAdapter(supportFragmentManager)
viewPager.adapter = pagerAdapter

然后我们就可以运行程序,查看效果了。

3. 示例说明

3.1 示例1:自定义TabLayout样式

如果我们想要改变TabLayout的样式,可以通过修改TabLayout的布局文件来实现。例如,我们可以将标签的文字和图标排成一列。

<com.google.android.material.tabs.TabLayout
    android:id="@+id/tab_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabIconGravity="textTop"
    app:tabIndicatorHeight="0dp"
    app:tabGravity="fill"
    app:tabMode="fixed"
    app:tabPadding="16dp"
    app:tabTextColor="#555"
    app:tabSelectedTextColor="#343434"
    app:tabBackground="@color/white"
    app:tabLayout="@layout/layout_tab_vertical"/>

同时,我们需要创建一个新的布局文件“layout_tab_vertical.xml”,用于定义每个标签的样式。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.tabs.TabItem xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center">

        <ImageView
            android:id="@+id/tab_icon"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_gravity="center"/>

        <TextView
            android:id="@+id/tab_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:textColor="@color/tab_text_color"/>
    </LinearLayout>

</com.google.android.material.tabs.TabItem>

同时在PagerAdapter中的getPageTitle方法中为ViewPager填充内容时需要修改:

override fun getPageTitle(position: Int): CharSequence? {
    return null
}

//修改FragmentPagerAdapter  getItem 方法
override fun getItem(position: Int): Fragment {
    return fragments[position]
}

// 添加一个getName方法,用于获取标签的文字和图标
fun getName(position: Int): Pair<Int, String> {
    return when (position) {
        0 -> Pair(R.drawable.ic_home_24, "首页")
        1 -> Pair(R.drawable.ic_category_24, "分类")
        2 -> Pair(R.drawable.ic_cart_24, "购物车")
        3 -> Pair(R.drawable.ic_mine_24, "我的")
        else -> Pair(0, "")
    }
}

最后修改TabLayout中的Tab标签的图标和文字(addOnTabSelectedListener监听点击事件):

for (i in 0 until 4) {
    val tab = tabLayout.getTabAt(i)
    tab?.customView = tabItemView(i)
}

// 创建标签的视图
private fun tabItemView(position: Int): View {
    val tabItemView = layoutInflater.inflate(R.layout.layout_tab_vertical, null) as LinearLayout
    val imageView = tabItemView.findViewById<ImageView>(R.id.tab_icon)
    val textView = tabItemView.findViewById<TextView>(R.id.tab_title)
    val name = pagerAdapter.getName(position)
    imageView.setImageResource(name.first)
    textView.text = name.second
    return tabItemView
}

// 添加选中监听
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
    //当标签被选择时,设置标签的状态
    override fun onTabSelected(tab: TabLayout.Tab?) {
        val view = tab?.customView
        val imageView = view?.findViewById<ImageView>(R.id.tab_icon)
        val textView = view?.findViewById<TextView>(R.id.tab_title)
        imageView?.setColorFilter(Color.parseColor("#007AFF"))
        textView?.setTextColor(Color.parseColor("#007AFF"))
    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {
        val view = tab?.customView
        val imageView = view?.findViewById<ImageView>(R.id.tab_icon)
        val textView = view?.findViewById<TextView>(R.id.tab_title)
        imageView?.setColorFilter(Color.parseColor("#343434"))
        textView?.setTextColor(Color.parseColor("#343434"))
    }

    override fun onTabReselected(tab: TabLayout.Tab?) {}
})

3.2 示例2:修改ViewPager切换模式

默认情况下,ViewPager的切换模式为水平滑动的页面切换,我们也可以通过修改ViewPager属性来改变切换模式。例如,我们可以设置为竖直方向上的页面切换。

val viewPager = findViewById<ViewPager>(R.id.view_pager)
viewPager.adapter = MyPagerAdapter(supportFragmentManager)
viewPager.orientation = ViewPager2.ORIENTATION_VERTICAL

这里需要注意的是,使用ViewPager2时需要将PagerAdapter改为FragmentStateAdapter,且需要指定FragmentStateAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT模式。

class MyPagerAdapter(fm: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fm, lifecycle) {
    ...
}

val viewPager = findViewById<ViewPager2>(R.id.view_pager)
viewPager.adapter = MyPagerAdapter(supportFragmentManager, lifecycle)
viewPager.orientation = ViewPager2.ORIENTATION_VERTICAL

至此,Android中TabLayout结合ViewPager实现页面切换的完整攻略就已经讲解完毕了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中TabLayout结合ViewPager实现页面切换 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Linux操作系统中读取目录文件信息的过程分析

    Linux操作系统中读取目录文件信息的过程分析 概述 Linux操作系统中,读取目录文件信息是一个常见的操作,比如列出目录中所有文件名、文件大小、修改时间等信息。在Linux中,可以使用命令行工具ls来查看目录中的文件信息,但是它只是一个命令,是在操作系统内部调用的一系列系统调用实现的。本文将介绍Linux操作系统中读取目录文件信息的过程分析,包括使用ls命…

    other 2023年6月26日
    00
  • DOS批处理高级教程 第三章 FOR命令中的变量

    DOS批处理高级教程 第三章 FOR命令中的变量 一、概述 在DOS批处理中,FOR命令是非常常用的一个命令,在处理批处理脚本时,可以利用FOR命令来循环处理一些操作,从而提高效率和减少手动输入命令的时间。 二、变量的定义 在FOR命令中,有三个变量可以使用,分别是: %%i:在FOR /F命令中,表示从文件或命令中读取的值; %i:在FOR命令中,表示需要…

    other 2023年6月26日
    00
  • ios8.2 beta2下载地址 ios8.2 beta2固件下载地址总汇

    很抱歉,但我无法提供关于非法下载或获取未经授权的软件的指导。这种行为可能违反软件的使用条款和法律法规。我建议您遵守官方渠道获取软件更新,以确保您的设备的安全和稳定性。 如果您有任何其他关于iOS 8.2 beta 2的问题,我将很乐意为您提供帮助。

    other 2023年8月4日
    00
  • Linux bash Shell中的变量类型详解

    Linux Bash Shell中的变量类型详解 在Linux Bash Shell中,有三种主要类型的变量:环境变量、局部变量和位置参数。本文将详细介绍这三种变量类型。 环境变量 环境变量是可以被shell及其所有子进程访问和修改的变量。shell会在启动时自动引入一些环境变量,比如PATH变量。PATH变量定义了shell在查找可执行文件时的搜索路径。 …

    other 2023年6月27日
    00
  • Android反编译看看手Q口令红包的实现原理

    以下是使用标准的Markdown格式文本,详细讲解Android反编译手Q口令红包的实现原理的完整攻略: Android反编译手Q口令红包的实现原理 步骤一:反编译APK文件 使用工具如apktool或dex2jar将APK文件反编译为可读取的源代码。 示例代码: apktool d app.apk -o app 步骤二:分析源代码 在反编译后的源代码中,查…

    other 2023年10月14日
    00
  • 解析获取优酷视频真实下载地址的PHP源代码

    解析获取优酷视频真实下载地址的PHP源代码攻略 简介 优酷视频是中国最大的视频分享网站之一,它提供了丰富的视频内容。然而,优酷视频并不直接提供下载功能,因此我们需要通过解析获取其真实下载地址。本攻略将介绍如何使用PHP编写代码来解析获取优酷视频的真实下载地址。 步骤 步骤一:获取视频ID 首先,我们需要获取要下载的优酷视频的ID。可以通过优酷视频的URL来获…

    other 2023年8月4日
    00
  • windows系统怎么把虚拟内存从C盘移到D盘?

    将虚拟内存从C盘移到D盘的攻略 以下是将虚拟内存从C盘移到D盘的详细步骤: 打开“控制面板”:点击Windows开始菜单,然后在搜索栏中输入“控制面板”,并选择打开。 进入“系统和安全”:在控制面板中,找到“系统和安全”选项,然后点击进入。 打开“系统”:在“系统和安全”页面中,找到“系统”选项,然后点击进入。 进入“高级系统设置”:在“系统”页面中,找到右…

    other 2023年8月1日
    00
  • Android日期选择控件使用详解

    Android日期选择控件使用详解 简介 Android提供了很多可以帮助我们简化应用程序开发的组件或者控件,其中一个比较常用的组件就是日期选择控件。 在Android应用程序中使用日期选择控件可以帮助我们实现多种功能,比如选择出生日期、选择活动时间等。 本文将介绍如何使用Android日期选择控件,包括日期选择控件的使用方法、属性设置以及监听事件等。 日期…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部