Toolbar 是 Google 在安卓 5.0(LOLLIPOP) 推出的一個控制元件,在安卓 3.0 時代 Google 推出了 ActionBar,而 Toolbar 完全是用來替代 ActionBar 的。既然叫 Toolbar,怎麼會不能實現某些需求?
使用
系統版本 >= 5.0
主題要繼承 @android:style/Theme.Material
,這樣我們的 Activity 的標題欄預設都是 android.widget.Toolbar
,如果需要在佈局中使用 Toolbar,那麼主題需要設定成 NoActionBar
樣式,並且程式碼中呼叫方法 setActionBar(android.widget.Toolbar)
,如:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_layout)
Toolbar toolbar = findViewById(R.id.toolbar)
setActionBar(toolbar)
}
複製程式碼
系統版本 < 5.0
前面說到過,Toolbar 是 5.0 才推出的一個控制元件,5.0 以下系統是無法使用的,而 Google 推出了向下相容庫v7-compat
,使用android.support.v7.widget.Toolbar
,使用步驟如下:
- 專案中引入
com.android.support:appcompat-v7:version-code
- 主題要繼承
Theme.AppCompat
- Activity 繼承
AppCompatActivity
這樣我們的 Activity 的標題欄預設都是 android.support.v7.widget.Toolbar
,如果需要在佈局中使用 Toolbar,那麼主題需要設定成 NoActionBar
樣式,並且程式碼中呼叫方法 setSupportActionBar(android.support.v7.widget.Toolbar)
,如:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_layout)
Toolbar toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
}
複製程式碼
下面列舉不同需求場景的實現方式
標題居中
獲取 Toolbar 中的第一個子 View,重置 LayoutParams,示例:
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toolbar toolbar = findViewById(R.id.toolbar);
View titleView = toolbar.getChildAt(0);
Toolbar.LayoutParams layoutParams = new Toolbar.LayoutParams
(Toolbar.LayoutParams.WRAP_CONTENT,
Toolbar.LayoutParams.WRAP_CONTENT, Gravity.CENTER);
titleView.setLayoutParams(layoutParams);
}
複製程式碼
上面程式碼是將 Toolbar 元件內嵌顯示標題的 TextView 重置 LayoutParams,當然也可直接呼叫 Toolbar.addView(View)
方法,新增自己建立的控制元件來顯示標題。如果是在佈局中使用了 Toolbar,也可以直接在佈局中為 Toolbar 標籤中新增一個顯示標題控制元件,然後實現居中。
友情提醒:假如不用 Toolbar 元件內嵌顯示標題的 TextView 時,一定要呼叫
ActionBar.setDisplayShowTitleEnabled(false)
方法禁止顯示標題。
更改標題字型大小和顏色
此需求主要是會對使用 Toolbar 元件預設顯示標題的方式時解決辦法
程式碼設定
// 更改顏色
Toolbar.setTitleTextColor(@ColorInt int color)
// 更改顏色和大小
Toolbar.setTitleTextAppearance(Context context, @StyleRes int resId)
複製程式碼
主題設定
-
系統版本 >= 6.0,主題採用 Theme.Material
直接設定屬性
android:titleTextColor
,大小設定參考 系統版本 >= 5.0 -
系統版本 >= 5.0,主題採用 Theme.Material
直接設定屬性
android:textColorPrimary
可更改顏色,大小設定參考下面兩種情況主題採用非 NoActionBar 樣式
設定屬性
android:actionBarStyle
,然後在定義的actionBarStyle
樣式中定義屬性android:titleTextStyle
,此屬性為 TextAppearance,可定義字型大小與顏色主題採用 NoActionBar 樣式(佈局中使用 Toolbar )
設定屬性
android:toolbarStyle
,,然後在字義的toolbarStyle
樣式中定義屬性android:titleTextAppearance
,可定義字型大小與顏色 -
系統版本 < 5.0,主題採用 Theme.AppCompat
目前開發需要兼顧低版本,所以實際開發中,上面說的兩種情況基本不會用到,所以採用此方式可以相容上面提到的方案
主題採用非 NoActionBar 樣式
設定屬性
actionBarStyle
,然後在定義的actionBarStyle
樣式中定義屬性titleTextStyle
,此屬性為 TextAppearance,可定義字型大小與顏色主題採用 NoActionBar 樣式(佈局中使用 Toolbar )
設定屬性
toolbarStyle
,,然後在定義的toolbarStyle
樣式中定義屬性titleTextAppearance
,可定義字型大小與顏色
新增其它 View 並居中
請參考文章開頭提到的 標題居中 處理方案
返回按鈕
顯示返回圖示
程式碼呼叫方法 ActionBar.setDisplayHomeAsUpEnabled(true)
ActionBar.setDisplayHomeAsUpEnabled(true);
複製程式碼
更改返回圖示
呼叫ActionBar.setDisplayHomeAsUpEnabled(true)
方法後預設顯示的圖示如下圖撥所示:
程式碼呼叫Toolbar.setNavigationIcon()
方法自定義 icon,主題中設定屬性homeAsUpIndicator
監聽返回按鈕點選事件
直接上程式碼:
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// onBackPress()
}
});
複製程式碼
或者
//重寫 Activity 方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
// onBackPress()
return true;
}
return super.onOptionsItemSelected(item);
}
複製程式碼
佈局中使用,設定屬性navigationIcon
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
app:navigationIcon="@drawable/ic_close_black_24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
複製程式碼
右上角新增操作按鈕
此場景依然可以參考場景 標題居中 中新增自定義 View 的方式,只是將方向改為 right 即可,這裡不重點講解,下面主要講解一種優雅的方式
不管是圖示按鈕
還是文字按鈕
,都可以通過給 Activity 設定 menu 實現,這裡就不講解 menu 的使用,這裡主要講解當按鈕是純文字時的樣式修改(圖示按鈕能用)
主題中設定屬性actionButtonStyle
即可定製外觀樣式,如果只是想修改文字顏色,設定屬性actionMenuTextColor
即可,如果還要設定文字大小,找屬性actionMenuTextAppearance
進行設定。
修改 OverflowButton 樣式
首先普及下 OverflowButton
是啥玩意,當我們使用 action menu 時,點選展開更多選項的那個按鈕,如下圖 icon :
見到這熟悉的三個黑點,是不是瞬間知道是什麼東西了。那麼怎麼更改這個圖示了?依然設定主題,設定屬性actionOverflowButtonStyle
就可以更換你們設計師所設計的圖示了。
高度
相應大家都發現 Toolbar 預設的高度(56dp)
並不是我們們設計師所設計的尺寸(88px)
,老規矩,設定主題樣式,屬性actionBarSize
結語
至此,雖然此文章並非把所有有關 Toolbar 的樣式設定都有講到,但基本列舉出了開發中一些常用的需求場景,如果你還有其它設計需求不知道怎麼實現或沒找到實現方式,歡迎大家留言一起探討。最後奉上一張圖: