在 Android 开发中,有时我们需要在布局中有一个高度为 0 的 View,然而使用 Material Design 实现的 FloatingActionButton (浮动操作按钮) 却无法显示在这样的 View 中。本文将详细介绍这个问题的原因以及解决方案,并附上示例代码。
问题的原因
在使用 Material Design 实现的 FloatingActionButton 时,往往会使用 CoordinatorLayout 作为布局容器。CoordinatorLayout 具有一种特殊的布局行为,即可以根据其子 View 之间的交互来调整子 View 的位置和大小。FloatingActionButton 的默认布局行为是 AnchorPointBehavior,其定位是基于给定的锚点 View 来计算的。当锚点 View 的高度为 0 时,FloatingActionButton 无法正常显示在其上方。
解决方案
使用自定义布局行为
通过自定义 FloatingActionButton 的布局行为,可以改变其定位的计算方式,从而使其在高度为 0 的 View 上正常显示。示例代码如下:
// javascriptcn.com 代码示例 public class ZeroHeightBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> { public ZeroHeightBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull FloatingActionButton child, @NonNull View dependency) { return dependency.getHeight() == 0; } @Override public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull FloatingActionButton child, @NonNull View dependency) { child.setTranslationY(-(dependentView.getHeight() / 2)); return true; } }
在这个自定义布局行为中,我们首先重写了 layoutDependsOn 方法,判断 dependency(锚点 View)是否为高度为 0 的 View,如果是则返回 true,表示依赖关系成立。然后我们重写了 onDependentViewChanged 方法,在其中改变 FloatingActionButton 的位置,这里我们将其向上移动了 dependentView.getHeight() / 2 的距离,使其正好位于高度为 0 的 View 的中心位置。
接下来,在布局文件中将 FloatingActionButton 指定布局行为为自定义的 ZeroHeightBehavior,即可解决高度为 0 的 View 中 FloatingActionButton 无法显示的问题。
// javascriptcn.com 代码示例 <androidx.coordinatorlayout.widget.CoordinatorLayout android:id="@+id/coordinator" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/zeroHeightView" android:layout_width="match_parent" android:layout_height="0dp"/> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" app:fabSize="normal" app:layout_behavior=".ZeroHeightBehavior" app:srcCompat="@drawable/ic_add"/> </androidx.coordinatorlayout.widget.CoordinatorLayout>
使用 android:elevation 属性
在布局文件中为高度为 0 的 View 添加 android:elevation 属性,即可使其在 z 轴方向上处于比 FloatingActionButton 更高的层级,从而使 FloatingActionButton 能够显示在其上方。示例代码如下:
<View android:id="@+id/zeroHeightView" android:layout_width="match_parent" android:layout_height="0dp" android:elevation="1dp"/>
总结
本文介绍了使用 Material Design 实现的 FloatingActionButton 在高度为 0 的 View 中无法显示的问题及其解决方案。通过自定义布局行为或使用 android:elevation 属性,都可以使 FloatingActionButton 正常显示在高度为 0 的 View 上方。对于 Android 开发中遇到的其他问题,我们也可以通过深入研究其原因并寻找解决方案来达到的理解和提升技术水平的目的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6534b4d67d4982a6eb9c3b60