本文為 Nick Rout 發布于 Medium 的文章譯文(Google 翻譯)
原文鏈接為 Hands-on with Material Components for Android: Bottom App Bar
本文僅作為個人學習記錄所用。如有涉及侵權,請相關人士盡快聯系譯文作者。
Android MDC 系列文章:
- 第一篇:【譯】為Android設置Material Components主題
- 第二篇:【譯】Android材質組件的動手實踐:Bottom App Bar
- 第三篇:【譯】Android材質組件的動手實踐:Bottom Navigation
- 第四篇:【譯】Android材質組件的動手實踐:Bottom Sheet
- 第五篇:【譯】Android材質組件的動手實踐:Buttons
- 第六篇:【譯】Android材質組件的動手實踐:Chips
- 第七篇:【譯】Android材質組件的動手實踐:Cards
- 第八篇:【譯】Android材質組件的動手實踐:Dialogs
- 第九篇:【譯】Android材質組件的動手實踐:Selection Controls
這篇文章將介紹 Bottom App Bar 組件的功能和API。要了解如何處理Android的Material Components的初始設置(包括Gradle依賴關系和創建應用程序主題),請參閱我的原始文章:
為Android設置Material Components主題
Bottom App Bar 是對傳統頂部應用欄(aka Toolbar
或ActionBar
在Android世界中)的繼承,有人認為這是《材料指南》 v1 的定義部分。底部應用欄保留了應用欄的核心功能,同時在關鍵區域提供了全新的外觀和功能改進。
與頂部應用程序一樣,底部應用程序欄可用于:
- 使用圖標菜單項突出顯示重要的屏幕操作
- 通過導航圖標菜單項提供與應用程序導航進行交互的方式(例如,打開導航抽屜或向后/向上導航)
- 充當FAB(浮動操作按鈕)的錨點
但是,將底部應用欄與眾不同的特征是:
- 人體工程學:底部位置使單手操作移動設備更容易
- 靈活性:正如我們將進一步探討的那樣,底部應用程序欄的布局以及FAB和圖標菜單項的位置可以根據屏幕的需要進行更改
基本用法??
BottomAppBar
可以將A 包含在您的屏幕布局中,如下所示:
< androidx.coordinatorlayout.widget.CoordinatorLayout
... >
< com.google.android.material.bottomappbar.BottomAppBar
android:id =“ @ + id / bottomAppBar
android:layout_width =” match_parent“
android:layout_height =” wrap_content“
android: layout_gravity =“ bottom” />
</ androidx.coordinatorlayout.widget.CoordinatorLayout >
如上所述,理想情況下ViewGroup
,a 的父級BottomAppBar
應該是a CoordinatorLayout
。這樣可以完全自定義滾動和FAB錨定行為。
處理菜單和導航項目??
BottomAppBar
可以使用與Toolbar
(其父類)相同的方式或通過特定于的新便利功能來實現A 的菜單BottomAppBar
。
使用setSupportActionBar
對于大多數Android開發人員來說,這應該是熟悉的領域。與一樣Toolbar
,可以使用多種掛鉤/回調將a附加BottomAppBar
到Activity
或Fragment
,從而使菜單膨脹并處理項目單擊。為此,您需要使用AndroidX AppCompatActivity 和/或 Fragment 類。您還應該使用*.NoActionBar
應用程序主題變體。
如果您使用Fragment
,則首先需要在回調中啟用上述菜單Fragment#onCreate
回調:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
注意:如果使用,則沒有必要*Activity*
。
擴大布局后,您需要讓Activity
/ Fragment
知道您BottomAppBar
是屏幕的主要操作欄,以便將其鏈接到回調。這可以在Activity#onCreate
回調(在調用之后setContentView
,除非您使用[ContentView](https://developer.android.com/reference/androidx/annotation/ContentView)
批注)或Fragment#onViewCreated
回調中完成:
override fun onViewCreated(view:View,savedInstanceState:Bundle?){
val activity =(requireActivity()as AppCompatActivity)
activity.setSupportActionBar(bottomAppBar)
}
現在,您可以使用可覆蓋的回調來擴大菜單資源和處理項目單擊。這在Android菜單文檔中有詳細說明。
使用便利功能
與以前的方法相比,存在用于使BottomAppBar
菜單膨脹的更簡單的便捷功能:
bottomAppBar.replaceMenu(R.menu。menu_bottom_app_bar)
設置一個菜單項單擊事件:
bottomAppBar.setOnMenuItemClickListener { item ->
when(item.itemId) {
R.id.item1 -> {
// Do something for menu item 1
true
}
R.id.item2 -> {
// Do something for menu item 2
true
}
else -> false
}
}
導航項呢?
鑒于導航項目不屬于膨脹菜單的一部分,因此需要在上分別進行設置BottomAppBar
。這可以用XML完成:
< com.google.android.material.bottomappbar.BottomAppBar
...
app:navigationIcon =“ @ drawable / ic_navigation”
app:navigationContentDescription =“ @ string / cd_navigation” />
另外,也可以通過編程方式完成:
bottomAppBar.setNavigationIcon(R.drawable。ic_navigation)
bottomAppBar.setNavigationContentDescription(R.string。cd_navigation)
檢測單擊導航項的時間與常規菜單項的完成非常相似。
如果您使用的是上述setSupportActionBar
方法,請檢查回調中的android.R.id.home
ID onOptionsItemSelected
。
另外,還存在一個便利功能:
bottomAppBar.setNavigationOnClickListener {
//對導航項進行操作
}
錨定FAB?
甲FloatingActionButton
可錨固到BottomAppBar
。這引起了人們對FAB的重要屏幕動作的注意,同時還減少了兩個組件占用的垂直空間。菜單項將根據所選的錨固屬性更改位置。
從設計的角度來看,有兩種錨定FAB的方法:
-
插圖:變形后的形狀
BottomAppBar
允許FAB在“切口”內“搖籃”(在同一高度)。這是默認行為。
-
重疊:FAB只是放置在上方
BottomAppBar
(較高的高度),對形狀沒有影響。
注意:《材料指南》告誡不要將擴展FAB與底部應用欄一起使用。在Android的Material Components中添加了有限的錨定支持*1.1.0-alpha04*
,但不支持摳圖和動畫。
為了實現這一點,FAB還需要位于父級中CoordinatorLayout
:
< androidx.coordinatorlayout.widget.CoordinatorLayout
... >
< com.google.android.material.bottomappbar.BottomAppBar
... />
< com.google.android.material.floatingactionbutton.FloatingActionButton
...
app:layout_anchor =“ @ id / bottomAppBar“ />
</ androidx.coordinatorlayout.widget.CoordinatorLayout >

默認情況下,FAB固定并水平居中對齊。存在許多屬性可以自定義這些屬性:
-
fabAlignmentMode
:FAB的水平對齊。可以將其設置為center
(FAB_ALIGNMENT_MODE_CENTER
,默認)或end
(FAB_ALIGNMENT_MODE_END
)。以編程方式更改后,fabAnimationMode
將運行隱藏/顯示動畫(由下面定義)。
-
fabCradleMargin
:FAB邊緣與通訊BottomAppBar
座切口之間的距離。默認為5dp
。
-
fabCradleRoundedCornerRadius
:通訊BottomAppBar
座切口的拐角半徑。默認為8dp
。
-
fabCradleVerticalOffset
:FAB相對于通訊BottomAppBar
座切口的垂直偏移距離。默認值為0dp
,表示FAB中心將與的頂部對齊BottomAppBar
。
-
fabAnimationMode
:更改時使用的動畫樣式fabAlignmentMode
(如上所述)。可以將其設置為scale
(FAB_ANIMATION_MODE_SCALE
,默認)或slide
(FAB_ANIMATION_MODE_SLIDE
)。
注意:所有這些屬性也可以通過編程設置。
這些屬性的命名表明該BottomAppBar
組件不支持重疊的FAB錨。但是,我們可以使用fabCradleMargin
和fabCradleRoundedCornerRadius
來偽造此行為0dp
。
滾動行為?
如果屏幕上包含可滾動的內容(例如A RecyclerView
或NestedScrollView
),則可以BottomAppBar
使用hideOnScroll
屬性控制響應滾動的方式。同樣,滾動容器也需要位于父容器中CoordinatorLayout
:
< androidx.coordinatorlayout.widget.CoordinatorLayout
... >
< androidx.core.widget.NestedScrollView
... />
< com.google.android.material.bottomappbar.BottomAppBar
...
app:hideOnScroll =“ true” />
< / androidx.coordinatorlayout.widget.CoordinatorLayout >
如果設置為true
,則BottomAppBar
在上/下滾動內容時,將以動畫方式自動隱藏/顯示。
您可以BottomAppBar
用BottomAppBar#performHide
/ BottomAppBar#performShow
分別以編程方式隱藏/顯示。
主題??
本BottomAppBar
:可以在三個材料主題化子系統方面進行主題顏色,排版和形狀。有兩個從繼承的樣式變體Widget.MaterialComponents.BottomAppBar
,每個樣式變體都帶有可選的樣式后綴:Surface(默認,無后綴)和彩色(*.Colored
)。實施全局自定義BottomAppBar
樣式時,請在您的應用程序主題中使用bottomAppBarStyle
屬性引用它。
顏色
BottomAppBar
可以使用該backgroundTint
屬性自定義背景色。colorSurface
對于表面底部應用程序欄和colorPrimary
彩色底部應用程序欄,默認為。
注意:請勿*android:background*
與一起使用*BottomAppBar*
,因為這會破壞FAB通訊座的內部處理。
BottomAppBar
可以使用該materialThemeOverlay
屬性自定義菜單/導航項目的顏色。有兩個從繼承的主題覆蓋變體ThemeOverlay.MaterialComponents.BottomAppBar
,每個都有一個樣式后綴:Surface(*.Surface
)和彩色(*.Colored
)。它們包含兩個屬性:(colorControlNormal
用于自定義菜單/導航圖標顏色)和actionMenuTextColor
(用于自定義溢出菜單文本顏色)。通常,您希望保持相同。colorOnSurfaceEmphasisMedium
對于表面底部應用欄和colorOnPrimary
彩色底部應用欄,它們默認為。
注意:以上方法要求您將菜單/導航圖標資源的色調/顏色設置為*colorControlNormal*
。如果使用[*VectorDrawable*](https://developer.android.com/reference/android/graphics/drawable/VectorDrawable)
s,則可以通過*android:tint*
屬性來實現。如果您使用的是柵格(PNG / JPG)資產,則可以將其包裝*<bitmap>*
在新的XML資源中,以應用*android:tint*
。這不像例如*itemIconTint*
屬性那樣直觀。您可以星發布此的問題跟蹤器。
版式
沒有主要文本作為BottomAppBar
組件的一部分。但是,對于大型菜單,將有一個溢出操作菜單。這些文本項將采用fontFamily
您的應用主題中定義的屬性。
形狀
在撰寫本文時,適用于Android的材料組件的最新版本為,1.2.0-alpha05
并且全局形狀主題屬性(例如shapeAppearanceMediumComponent
)不受影響BottomAppBar
。具體來說,FAB通訊座僅支持圓角(相對于切角)。一個手動解決方法已被添加到材料零件的Android GitHub的倉庫,并希望使其進入形狀在未來的版本主題化。您可以星發布此的問題跟蹤器。
更多資源??
- 本文中使用的Playground應用程序的源代碼可以在GitHub上找到。
- 底部應用欄設計文檔
- 底部應用欄API文檔
我希望這篇文章對Bottom App Bar以及如何在您的Android應用程序中使用它有所了解。如果您有任何疑問,想法或建議,那么我很樂意收到您的來信!
在Twitter上找到我@ricknout