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

下面我就为您详细讲解“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日

相关文章

  • es数据迁移到另一个es数据库

    将ES数据迁移到另一个ES数据库的完整攻略如下: 确定迁移方案 在进行ES数据迁移之前,需要确定迁移方案。常见的迁移方案有以下几种: 使用ES官方提供的reindex API进行迁移。 使用第三方工具,如Logstash、Elasticsearch Migration Tool等进行迁移。 自己编写脚本进行迁移。 根据实际情况选择合适的迁移方案。 准备目标E…

    other 2023年5月7日
    00
  • 浅谈gulp创建完整的项目流程

    浅谈Gulp创建完整的项目流程可以分为以下几个步骤: 步骤一:安装和初始化 安装Node.js和npm 全局安装gulp:npm install gulp -g 在项目根目录下创建 package.json 文件:npm init 添加gulp依赖:npm install gulp –save-dev 步骤二:创建任务 在项目根目录下创建 gulpfile…

    other 2023年6月27日
    00
  • c#常用表格控件dataGridView的分页显示

    关于c#常用表格控件dataGridView的分页显示,这里提供一份完整攻略,包含以下几个部分: 准备工作 数据源绑定 分页控件的使用 代码示例 参考资料 下面对每个部分进行详细说明。 一、准备工作: 在开始使用dataGridView进行分页显示之前,需要做好一些准备工作,包括:1. 安装并引用数据库基础组件,例如MySql.Data.dll;2. 创建数…

    other 2023年6月26日
    00
  • python用列表生成式写嵌套循环的方法

    当使用Python编写嵌套循环时,可以使用列表生成式来简化代码。列表生成式是一种简洁的语法,可以在一行代码中生成列表。下面是使用列表生成式编写嵌套循环的完整攻略: 基本语法: 列表生成式的基本语法是在一个方括号内使用表达式和循环语句。 表达式用于生成列表中的每个元素,循环语句用于控制循环的次数和迭代的变量。 嵌套循环可以通过在列表生成式中添加多个循环语句来实…

    other 2023年7月27日
    00
  • Win11右键图标没反应怎么办?Win11桌面图标右键点不出来的解决方法

    Win11右键图标没反应怎么办 在Win11使用过程中,可能会遇到右键桌面图标无反应的问题,让人十分困惑。本文将提供几种解决方法,供大家参考。 方法一:重置Windows资源管理器 步骤如下: Ctrl + Shift + Esc 打开任务管理器 在“进程”选项卡中,找到“Windows资源管理器”,右键单击并选择“结束任务” 在任务管理器中,点击“文件”,…

    other 2023年6月27日
    00
  • 电脑启动中的常见故障的种类及其解决方法(图文)

    电脑启动中的常见故障及其解决方法 在使用电脑时,经常会出现各种启动问题,如不能开机、启动慢、系统崩溃等。下面将详细讲解电脑启动中常见故障的种类及其解决方法。 1. 电脑不能开机 如果电脑不能开机,有可能是以下原因: 1.1 电源故障 检查电源插头、电源线、开关,看它们是否正常工作。如果电源灯不亮或电源风扇不动,则可能是电源本身故障。 1.2 主板故障 如果电…

    other 2023年6月27日
    00
  • 使用git config –global设置用户名和邮件问题

    使用 git config 命令可以对 Git 的各种配置进行设置。其中,通过 –global 选项可以设置全局的配置信息,即在该用户的所有 Git 仓库中都使用同样的配置。 设置用户名: git config –global user.name "Your Name" 设置邮件地址: git config –global user…

    other 2023年6月27日
    00
  • linux和windows查看当前运行的python进程及gpu、cpu

    当我们在使用Python编写程序时,有时需要查看当前运行的Python进程以及GPU和CPU的使用情况。在Linux和Windows中,可以使用命令行工具来实现这一目的。以下是两种示例方法: 1. 在Linux中查看Python进程和GPU/CPU使用情况 查看Python进程 可以使用ps命令来查看当前运行的Python进程。以下是示例命令: ps -ef…

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