Material Design 实现的 FloatingActionButton 在高度为 0 的 View 中无法显示,解决方案大揭密!

在 Android 开发中,有时我们需要在布局中有一个高度为 0 的 View,然而使用 Material Design 实现的 FloatingActionButton (浮动操作按钮) 却无法显示在这样的 View 中。本文将详细介绍这个问题的原因以及解决方案,并附上示例代码。

问题的原因

在使用 Material Design 实现的 FloatingActionButton 时,往往会使用 CoordinatorLayout 作为布局容器。CoordinatorLayout 具有一种特殊的布局行为,即可以根据其子 View 之间的交互来调整子 View 的位置和大小。FloatingActionButton 的默认布局行为是 AnchorPointBehavior,其定位是基于给定的锚点 View 来计算的。当锚点 View 的高度为 0 时,FloatingActionButton 无法正常显示在其上方。

解决方案

使用自定义布局行为

通过自定义 FloatingActionButton 的布局行为,可以改变其定位的计算方式,从而使其在高度为 0 的 View 上正常显示。示例代码如下:

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

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

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

在这个自定义布局行为中,我们首先重写了 layoutDependsOn 方法,判断 dependency(锚点 View)是否为高度为 0 的 View,如果是则返回 true,表示依赖关系成立。然后我们重写了 onDependentViewChanged 方法,在其中改变 FloatingActionButton 的位置,这里我们将其向上移动了 dependentView.getHeight() / 2 的距离,使其正好位于高度为 0 的 View 的中心位置。

接下来,在布局文件中将 FloatingActionButton 指定布局行为为自定义的 ZeroHeightBehavior,即可解决高度为 0 的 View 中 FloatingActionButton 无法显示的问题。

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

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

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

使用 android:elevation 属性

在布局文件中为高度为 0 的 View 添加 android:elevation 属性,即可使其在 z 轴方向上处于比 FloatingActionButton 更高的层级,从而使 FloatingActionButton 能够显示在其上方。示例代码如下:

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

总结

本文介绍了使用 Material Design 实现的 FloatingActionButton 在高度为 0 的 View 中无法显示的问题及其解决方案。通过自定义布局行为或使用 android:elevation 属性,都可以使 FloatingActionButton 正常显示在高度为 0 的 View 上方。对于 Android 开发中遇到的其他问题,我们也可以通过深入研究其原因并寻找解决方案来达到的理解和提升技术水平的目的。

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


猜你喜欢

  • Mongoose 模块:防止重复插入数据的方法(二)

    在使用 Mongoose 进行 MongoDB 操作时,避免重复插入数据是非常重要的。在上一篇文章中,我们介绍了如何使用 Mongoose 验证插入的数据是否重复。

    1 年前
  • 如何使用 Cypress 测试 Angular 组件

    前端测试是保证产品质量的不可缺少的环节之一。Cypress 是一个面向现代 Web 应用的端到端测试框架,它提供了一流的 API、直观的交互式 UI 和具有开箱即用的特性。

    1 年前
  • 如何在 SASS 中使用 IE hack

    如何在 SASS 中使用 IE hack 在前端开发中,我们经常需要处理浏览器兼容性的问题,而在很多情况下,使用 IE hack 可以帮助我们解决这些问题。IE hack 是在 CSS 中使用特殊的语...

    1 年前
  • Node.js 中使用 Promise 的正确姿势

    如果你是一名 Node.js 开发者,那么你肯定知道 Promise 这个东西,因为在 Node.js 中,几乎所有异步操作都是基于 Promise 来实现的。Promise 可以让我们更方便地处理异...

    1 年前
  • ECMAScript 2016 中的新特性:Array.prototype.includes、Object.values/Object.entries 和字符串填充方法

    ECMAScript 2016 是 JavaScript 的一个版本,其中包含许多新的特性。其中,Array.prototype.includes、Object.values/Object.entri...

    1 年前
  • 使用 Fastify 和 Angular2 搭建一个完整的 Web 应用

    使用Fastify和Angular2搭建一个完整的Web应用 随着 Web 开发的迅速发展,越来越多的新技术和框架涌现出来。在这些技术中,Fastify 是一个高性能的 Web 应用程序框架,而 An...

    1 年前
  • 如何在 Chai 和 Mocha 中使用 sinon-chai-matchers 扩展检查规则

    在编写前端代码时,单元测试是不可或缺的一环。Chai 和 Mocha 是常用的测试框架,而 sinon-chai-matchers 则是一个方便扩展检查规则的工具。

    1 年前
  • Docker 容器的备份与恢复

    在前端开发中,我们经常需要创建多个容器用于测试和部署,这些容器包含着我们的应用程序、数据库和其他服务。然而,容器的管理是一项挑战,因为容器中的数据会频繁地增加和改变,而容器的销毁和重建也是一项复杂的任...

    1 年前
  • 使用 Redux-Form 处理复杂表单

    Redux-Form 是一个基于 React 和 Redux 的表单处理库,在处理复杂表单时非常方便。Redux-Form 可以帮助我们处理表单的数据流、表单的校验、表单状态的管理等方面,大大简化了开...

    1 年前
  • 浅说 ES12 中的 Promise.any()

    Promise.any() 的定义 Promise.any() 方法接收一个 Promise 数组作为参数,返回 Promise 对象。只要有一个 Promise 对象状态变成 fulfilled,就...

    1 年前
  • Kafka 性能调优手册

    前言 Kafka 是现代消息队列系统中的一员,作为 Facebook 制造的日志系统的后续革新。通过将数据存储在持久化磁盘上,Kafka 在一些重要的应用场景中非常有用,如: 日志聚合 流处理 实时...

    1 年前
  • ES8 标准下的数据类型 Symbol 详解

    在 ES8 标准中,新增了一种数据类型 Symbol,这种类型是唯一的、不可变的,可以作为对象属性的标识符,具有一定的安全性和隐私保护。 Symbol 的定义和使用 定义 Symbol 是一种原始...

    1 年前
  • ES2020 中 Promise.allSettled 详解

    在 ES2020 中,Promise.allSettled 是一个新增的方法,它的作用是在所有的 Promise 实例都完成后返回一个状态,表示每个 Promise 实例的结果,而不管其中是否有 Pr...

    1 年前
  • Sequelize 如何使用枚举数据类型

    前言 Sequelize 是一款 Node.js 中使用最广泛的 ORM 框架之一,它提供了丰富而强大的 API 用于操作各种数据库。在实际的业务应用中,经常需要对数据库中特定字段的取值做出限制,此时...

    1 年前
  • Kubernetes 的默认存储卷 EmptyDir 详解

    在 Kubernetes 中,存储卷(Volume)是一种管理容器内持久化数据的机制,可以让容器间共享数据以及数据持久化。EmptyDir 是 Kubernetes 中的一种默认存储卷类型,本文将介绍...

    1 年前
  • SSE 技术在大规模应用中的最佳实践

    引言 随着 Web 技术的不断发展,越来越多的应用需要实现实时性、实时更新和实时推送等功能。在实现这些功能的过程中,服务器端推送技术是非常重要的一种技术手段。而 SSE(Server-Sent Eve...

    1 年前
  • 使用 Babel-plugin-transform-decorators-legacy 处理装饰器

    装饰器的定义 装饰器(Decorator)是一种用来修饰类、方法、属性等的语法。在 es7 之前,修饰类、方法、属性等常常采用继承、混合等方式实现。而在 es7 中,标准中提供了装饰器语法,用户可以更...

    1 年前
  • 微前端中 Next.js 框架的使用探讨

    前言 微前端是一种新的前端架构模式,它将整个网站划分为多个独立的部分,每个部分都由一个团队进行开发和维护。这种方式可以大大降低团队间的耦合度,提高代码的复用性和可维护性。

    1 年前
  • Custom Elements 中如何实现文章列表渲染

    前言 在前端开发中,我们经常需要使用列表来展示数据,其中文章列表是常见的一种。使用 Custom Elements 可以轻松地实现文章列表的渲染和展示,同时也可以拓展出更多的功能。

    1 年前
  • MongoDB 优化索引学习笔记

    本文旨在向大家介绍如何优化 MongoDB 的索引,从而让我们的数据查询操作更快速、更高效。若您已经对 MongoDB 有一定的了解,可以直接跳过前面的介绍部分。 MongoDB 简介 MongoDB...

    1 年前

相关推荐

    暂无文章