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