Material Design 中使用 ViewPager 和 TabLayout 实现导航栏教程

介绍

Material Design 是一种由 Google 推出的全新设计语言,其旨在提供一种全新的设计方法,解决跨平台应用的一些问题。在 Material Design 中,导航栏是一个非常重要的组件,可以在应用中帮助用户登录,切换页面等操作。在本文中,我们将通过 ViewPager 和 TabLayout 的使用,来实现一个 Material Design 风格的导航栏。

准备工作

在开始之前,请确保你已经安装了以下的环境和工具:

  • JDK 1.8 或以上版本
  • Android Studio 3.0 或以上版本

实现

创建项目

在 Android Studio 中,创建一个新的项目,并选择一个你喜欢的应用名称和图标。本文的示例代码中,我们将应用名设置为 “MaterialDesignNavigation”,并使用默认的图标。

创建布局

我们需要在项目中创建一个布局文件,用于展示导航栏。在 res/layout 目录下创建一个名为 activity_main.xml 的文件,代码如下:

----- ------------- ------------------
---------------------------------------------------- 
----------------------------------------------------------
---------------------------------------------------
-----------------------------------
-------------------------------------

------------------------------------------------
    -----------------------------------
    ------------------------------------
    ----------------------------------------------------------------------

    ----------------------------------
        -----------------------------------
        -------------------------------------------
        ---------------------------------------
        ---------------------------------------------------------------

    -------------------------------------------
        ----------------------------
        -----------------------------------
        ------------------------------------
        -------------------
        -----------------------

--------------------------------------------------

------------------------------------
    ----------------------------
    -----------------------------------
    ------------------------------------
    --------------------------------------------------------------

------------------------------------------------------

代码中包含两个组件,一个是 AppBarLayout,另一个是 ViewPager。其中 AppBarLayout 是包含导航栏的容器,我们在这个容器中放置了一个 Toolbar 和一个 TabLayout,ViewPager 是一个可以侧滑切换页面的组件。

创建 Fragment

为了实现侧滑切换页面的效果,我们需要在项目中创建一些 Fragments。在本文中,我们创建三个 Fragments,分别用于展示 “首页”,“消息”和 “我的” 三个页面的内容。在 res/layout 目录下创建三个布局文件,代码分别如下:

home_fragment.xml

------------- ----------------------------------------------------------
    -----------------------------------
    ------------------------------------
    ------------------------
    -------------------------------

    ---------
        -----------------------------------
        ------------------------------------
        ----------------------------------

---------------

message_fragment.xml

------------- ----------------------------------------------------------
    -----------------------------------
    ------------------------------------
    ------------------------
    -------------------------------

    ---------
        -----------------------------------
        ------------------------------------
        -------------------------------------

---------------

profile_fragment.xml

------------- ----------------------------------------------------------
    -----------------------------------
    ------------------------------------
    ------------------------
    -------------------------------

    ---------
        -----------------------------------
        ------------------------------------
        -------------------------------------

---------------

在代码中,我们只是简单地在每个 Fragment 中放置了一个 TextView,以便于快速展示每个页面。

创建 Adapter

为了实现 ViewPager 的效果,我们需要在项目中创建一个 Adapter,并将所有的 Fragment 加入到 Adapter 中。在本文中,我们创建了一个名为 NavigationPagerAdapter 的 Adapter,代码如下:

------ ----- ---------------------- ------- -------------------- -

    ------- -------------- -----------
    ------- ------------ --------

    ------ -------------------------------------- --- -------------- ---------- ------------ ------- -
        --------- ---------------------------------------
        ---------- - ----------
        ------- - -------
    -

    --------
    ---------
    ------ -------- ----------- --------- -
        ------ -------------------------
    -

    ---------
    ------ --- ---------- -
        ------ ------------------
    -

    ---------
    ---------
    ------ ------------ ---------------- --------- -
        ------ ----------------------
    -

-

在代码中,我们需要创建一个 List 用于存储所有的 Fragments,另外一个 List 存储 TabLayout 中每个 Tab 的标题。在 getItem() 方法中,我们根据位置获取对应的 Fragment,getCount() 返回总的 Fragment 数量,getPageTitle() 返回对应的标题。由于我们只展示三个 Fragment,因此 getCount() 固定返回 3。注意,在新版本的 Android Studio 中,FragmentPagerAdapter 的构造方法已经不推荐使用,我们建议使用特定的 FragmentStatePagerAdapter,这可以更好地处理 Fragment 的生命周期。

设置导航栏

在 MainActivity 中,我们需要绑定所有的组件,并使用 NavigationPagerAdapter 将所有的 Fragment 加入到 ViewPager 中。代码如下:

------ ----- ------------ ------- ----------------- -

    ------- --------- -----------
    ------- --------- -----------

    ---------
    --------- ---- --------------- ------------------- -
        -----------------------------------
        ---------------------------------------

        ---------- - ------------------------------
        ---------- - ------------------------------

        -------------- --------- - --- --------------
        ----------------- ----------------
        ----------------- -------------------
        ----------------- -------------------

        ------------ ------ - --- --------------
        ------------------------------------------
        ---------------------------------------------
        ---------------------------------------------

        ---------------------- ------- - --- --------------------------------------------------- ---------- --------
        -------------------------------
        ------------------------------------------

    -
-

在代码中,我们首先获取了 TabLayout 和 ViewPager 的实例,然后创建了一个包含所有 Fragment 的 List,在创建一个包含所有 Tab 标题的 List。最后,我们创建一个 NavigationPagerAdapter 并将其绑定到 ViewPager 上,并在 TabLayout 中设置 ViewPager。

效果展示

运行应用,效果如下图所示:

至此,我们已经成功地实现了一个 Material Design 风格的导航栏!

总结

在本文中,我们学习了如何使用 ViewPager 和 TabLayout 组件,在 Android 应用中实现一个 Material Design 风格的导航栏。希望本文能够解决您在应用开发中的问题,指导您的学习和工作。示例代码已上传到 Github,欢迎下载和学习。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/651f7e2695b1f8cacd70c27a


猜你喜欢

  • 使用 Less 模块化提高 CSS 可维护性

    在前端开发中,CSS 的复杂度和可维护性一直是令人头疼的问题。为了更好地管理 CSS 样式,可以使用 Less 这样的 CSS 预处理器。Less 可以让我们编写更结构化、模块化的 CSS,并且减少代...

    1 年前
  • 在 Vue.js 中使用 Promise 的技巧及注意事项

    引言 Promise 是现代 JavaScript 开发中非常重要的概念之一,它是一种异步编程解决方案,可以有效地处理回调嵌套问题。在 Vue.js 中,Promise 也被广泛应用于处理异步操作。

    1 年前
  • Redis 对 Lua 脚本的支持及使用方法详解

    介绍 Redis 是一种高效的键值数据库,而 Lua 是一种快速且轻量级的脚本语言。在 Redis 中,Lua 脚本可以被用来运行复杂的操作,通过将多个 Redis 命令组合成一个 Lua 脚本来实现...

    1 年前
  • 理解 JavaScript 中的 URLSearchParams 对象及其在 ECMAScript 2017(ES8)中的改进

    在现代 Web 开发中,处理 URL 参数是一项常见的任务。为了帮助开发人员更方便地操作 URL 参数,JavaScript 提供了 URLSearchParams 对象。

    1 年前
  • HBase 性能优化实战

    在海量数据存储方面,HBase 是一个备受欢迎的 NoSQL 数据库。但是,在使用 HBase 时,也需要注意一些性能方面的问题,否则,可能会影响 HBase 的性能和稳定性。

    1 年前
  • CSS Flexbox 布局指南,详解 6 种常见布局应用

    在前端开发过程中,经常需要对页面进行布局。而传统的 CSS 布局方式已经很难满足现代网页的各种需求,因此前端开发人员需要学习更加高效灵活的布局方式。本文将介绍 CSS Flexbox 布局,详解其中的...

    1 年前
  • RxJS 中的 mergeMap 和 concatMap 区别解析

    在RxJS中,mergeMap和concatMap是两个常见的操作符,它们通常用于将高阶可观察源(Observable source)转换为一些其他的值,这些值可以是另一个可观察源,也可以是普通的值。

    1 年前
  • PWA 技术如何实现数据的保密访问?

    PWA 技术如何实现数据的保密访问? PWA (Progressive Web Application) 是一种用于开发 web 应用程序的技术方案,通过使用 Service Worker 和 Cac...

    1 年前
  • MongoDB 数据库中数组操作 $pullAll 与 $pull 对比及使用技巧探讨

    MongoDB 是一种非关系型数据库,其经常被用于 Web 开发。在 MongoDB 中,数组是一种重要的数据类型,我们经常需要使用 $pullAll 和 $pull 这两种操作对数组进行修改。

    1 年前
  • 如何利用 Server-sent Events(SSE) 技术实现实时翻译应用

    在现代互联网应用中,实现实时通信和数据更新已经成为了一个基本需求,而Server-sent Events(SSE)技术则成为了一种非常好的方案。本文将介绍如何利用SSE技术实现实时翻译应用,其中包括了...

    1 年前
  • Serverless 应用的自动扩展和恢复

    随着云计算技术的不断发展,Serverless 架构模式越来越受到关注。Serverless 并不是指没有服务器,而是指用户不需要关注底层的服务器管理,只需要关注业务逻辑的实现。

    1 年前
  • Enzyme 测试 React Native 组件时遭遇的事件触发问题及解决方法

    Enzyme 测试 React Native 组件时遭遇的事件触发问题及解决方法 前言 React Native 是一款基于 React 框架的移动端开发工具,能够提供快速开发体验,但是在开发过程中经...

    1 年前
  • 解决 CSS Reset 带来的表单元素样式错乱问题

    在进行前端开发时,你可能会使用 CSS Reset 以消除浏览器默认样式。然而,CSS Reset 有时会导致 select、radio、checkbox 等表单元素的样式错乱,让你的页面看起来很不整...

    1 年前
  • Mongoose 中如何使用事务

    在使用 MongoDB 数据库进行开发时,我们往往会使用 Mongoose 这个 Node.js 的 ORM 框架来帮助我们完成数据的操作。而在一些情况下,我们需要进行事务控制,例如在数据库中对多个文...

    1 年前
  • 使用 Less 生成样式类的顺序问题探析

    随着前端技术的不断提升,CSS 的复杂度也随之增加。为了更好地管理和维护 CSS,前端开发者通常会使用 CSS 预处理器来生成样式代码。其中,Less 作为一种较为流行的 CSS 预处理器,其深受前端...

    1 年前
  • Node.js 中使用 Winston 实现日志记录和管理的技巧

    简介 在开发 Web 应用程序时,日志文件扮演着非常重要的角色。它们记录了应用程序的活动和错误情况,为开发人员提供了有价值的信息以调试应用程序。然而,在大型应用程序中,处理日志文件可能会变得十分困难。

    1 年前
  • 如何通过 CSS 实现响应式设计的 “图像优化”

    在响应式设计中,图像是一个特别需要注意的细节。一个过大的图片会导致页面加载缓慢,而过小的图片则可能导致失真或不清晰。本文将介绍如何使用CSS优化图像以适应不同设备大小,提高用户体验。

    1 年前
  • 如何解决 Headless CMS 在多重语言和多国市场下的难点

    在互联网全球化的趋势下,跨境电商、全球化企业、海外市场逐渐成为了首选目标。然而,在这一过程中,遇到的一大挑战就是如何将产品或服务本地化。Headless CMS 作为一个API驱动型的CMS系统,可以...

    1 年前
  • 使用 ECMAScript 2017 中的 Object.values() 和 Object.entries() 方法优化代码

    在前端开发中,我们经常使用对象来表示数据。然而,操作对象属性时可能会变得繁琐和冗长,这时候就可以使用 ECMAScript 2017(ES8)新增的 Object.values() 和 Object....

    1 年前
  • Cypress 如何在单元测试中使用 Sinon

    前言 在前端开发的过程中,进行单元测试是必不可少的一环,而 Sinon 是一个强大的 JavaScript 测试工具库,它支持测试中的 stub、spy 和 mock 等功能,使得单元测试更加简便易行...

    1 年前

相关推荐

    暂无文章