【问题标题】:CoordinatorLayout add padding between elementsCoordinatorLayout 在元素之间添加填充
【发布时间】:2017-05-15 20:09:30
【问题描述】:

我想在我的 CoordinatorView 中有两个 FloatingActionButton。但是当我尝试将边距添加到顶部 FloatingActionButton 时,它会从视图的末尾应用 - 它应该在 FloatingActionButtons 之间添加空间。 XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    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="match_parent">

<android.support.design.widget.FloatingActionButton
    android:id="@+id/wordpackAddButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="16dp"
    android:src="@drawable/add"
    app:elevation="5dp"
    app:layout_anchor="@id/wordpacks_list"
    app:layout_anchorGravity="bottom|right|end" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/importWordpack"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end"
    android:layout_marginBottom="16dp"
    android:src="@drawable/add"
    app:elevation="5dp"
    app:layout_anchor="@id/wordpackAddButton"
    app:layout_anchorGravity="top" />

<ListView
    android:id="@+id/wordpacks_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></ListView>
</android.support.design.widget.CoordinatorLayout>

【问题讨论】:

  • 那么当你将android:layout_marginBottom="16dp" 添加到第二个FAB 时它看起来如何?
  • @EugenPechanec 这就是问题所在。 FAB 看起来完全一样。但是当我添加 marginBottom="200dp" 时,它从 CoordinatorView 的右下角应用

标签: android android-coordinatorlayout floating-action-button floating-action-menu


【解决方案1】:

解决方案 1:

添加另一个View 以在两个FAB's 之间创建一个gap。将Viewanchor设置为wordpackAddButtontop位置,将importWordpack的锚点设置为Viewtop-right位置。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    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="match_parent">

    <ListView
        android:id="@+id/wordpacks_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/wordpackAddButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        android:src="@drawable/add"
        app:elevation="5dp"
        app:layout_anchor="@id/wordpacks_list"
        app:layout_anchorGravity="bottom|right|end" />

    <View
        android:id="@+id/gap"
        android:layout_width="16dp"
        android:layout_height="16dp"
        app:layout_anchor="@id/wordpackAddButton"
        app:layout_anchorGravity="top">

    </View>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/importWordpack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:src="@drawable/add"
        app:elevation="5dp"
        app:layout_anchor="@id/gap"
        app:layout_anchorGravity="top|center" />


</android.support.design.widget.CoordinatorLayout>

解决方案 2:

将两个FAB 包装成LinearLayoutanchor 这个布局到bottom-rightListView 位置。

这里有一个解决方法:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    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="match_parent">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_anchor="@id/wordpacks_list"
        app:layout_anchorGravity="bottom|right|end"
        android:layout_margin="16dp"
        android:background="@android:color/transparent"
        android:clipToPadding="false">

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/importWordpack"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="16dp"
            android:src="@drawable/add"
            app:elevation="5dp" />

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/wordpackAddButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="16dp"
            android:src="@drawable/add"
            app:elevation="5dp" />

    </LinearLayout>

    <ListView
        android:id="@+id/wordpacks_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>
</android.support.design.widget.CoordinatorLayout>

输出:

【讨论】:

  • 您必须使用填充而不是边距和android:clipToPadding="false",以便正确绘制阴影。仍然在 Lollipop 之前,插图会因为兼容阴影而变得更大,并且因为 FAB 不是 CoordinatorLayout 的直接子代,它们不会很好地与 Snackbars 配合使用(移开)。
【解决方案2】:

在 Fab 按钮之后添加此视图并更改顶级工厂的 layout_anchor 到 transparent_view。

<View
    android:layout_width="8dp"
    app:layout_anchor="@id/wordpackAddButton"
    app:layout_anchorGravity="top"
    app:useCompatPadding="false"
    android:layout_gravity="end"
    android:background="@android:color/transparent"
    android:id="@+id/transparent_view"
    android:layout_height="8dp"/>

希望对你有帮助。

【讨论】:

    【解决方案3】:

    我在实现 FAB 菜单时遇到了类似的问题。 您可以通过将第二个 FAB 包装在 FrameLayout 中来解决此问题,如下所示:

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/wordpackAddButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        app:elevation="5dp"
        app:layout_anchorGravity="bottom|right|end" />
    
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="56dp"
        app:layout_anchor="@id/wordpackAddButton"
        app:layout_anchorGravity="top|right">
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/importWordpack"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:layout_margin="16dp"
            app:elevation="5dp"
            app:layout_anchor="@id/wordpackAddButton" />
    </FrameLayout>
    

    这可能是一个 hacky 的解决方案,但它很简单而且很有效。 FrameLayoutpadding 值设置为 56dp,因为这是 FAB 的大小。

    【讨论】:

    • 这会弄乱棒棒糖下面的填充。 FAB 必须是 CoordinatorLayout 的直接子级,因此它可以正确减去由兼容阴影占用的额外空间并定位 FAB。
    • 哇谢谢你澄清我不知道!那么唯一的方法(甚至更hacky)是在这些FAB之间放置一个视图?
    猜你喜欢
    • 2011-12-12
    • 2021-10-22
    • 2013-02-04
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多