Skip to content

横幅 (Banner)

源:Banners

横幅在屏幕顶部(通常在 App Bar 下方)显示重要且简短的消息,并提供用户可执行的操作。

设计原则

Snackbar 不同,横幅是持久显示的,直到用户采取行动或将其关闭。它不应像 Dialog 那样模态阻塞用户。


代码实现

目前 Material 组件库没有提供名为 Banner 的具体 View,通常建议使用 MaterialCardView 或自定义 LinearLayout 来实现。

1. 基础布局实现

xml
<com.google.android.material.card.MaterialCardView
    android:id="@+id/banner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="0dp"
    app:cardElevation="0dp">

    <LinearLayout
        android:orientation="horizontal"
        android:padding="16dp"
        android:gravity="center_vertical">

        <ImageView
            android:layout_width="40dp"
            android:layout_height="40dp"
            app:srcCompat="@drawable/ic_wifi_off"
            app:tint="?attr/colorPrimary" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginStart="16dp"
            android:text="网络连接已断开,请检查设置。" />

        <com.google.android.material.button.MaterialButton
            style="?attr/borderlessButtonStyle"
            android:text="重试" />

    </LinearLayout>
</com.google.android.material.card.MaterialCardView>

2. 动画控制

通常需要使用动画让横幅从顶部平滑滑出。

kotlin
fun showBanner() {
    banner.visibility = View.VISIBLE
    banner.translationY = -banner.height.toFloat()
    banner.animate().translationY(0f).setDuration(300).start()
}

典型使用场景

  • 状态提示: 离线状态、定位服务不可用。
  • 权限引导: “请允许存储权限以保存图片”。
  • 紧急通知: 系统维护公告。

交互与 Dismiss

横幅必须包含至少一个明确的操作按钮(如“确定”、“了解详情”或“忽略”)。用户点击后,横幅应消失。