什么是Toolbar?
頭到尾,工具欄可以包含以下可選的元素:
- A navigation button(導航按鈕)。這里可能是向上箭頭,導航菜單,關閉,折疊,完成或應用程序中選擇的其他圖標。這個按鈕應始終用于訪問工具欄指定內容的容器內的其他導航目標,或者離開當前的上下文。
- A branded logo image(標志性的logo圖片)。
- A title and subtitle(標題或者子標題)。
- One or more custom views(或多個視圖)。
- *An action menu
*(動作菜單)。
如何使用Toolbar?
Android Api中給我們提供了多個版本的Toolbar給我們使用,包括3.0引入的ActionBar和v21中的Toolbar,但是為了達到應用體驗的一致性以及如今紛繁復雜的android平臺差異化的情況下我們選擇__
android.support.v7.widget.Toolbar__的Toolbar來使用。
-
添加android.support.v7.widget.Toolbar的依賴
dependencies { compile 'com.android.support:appcompat-v7:25.3.1' }
-
確保Activity繼承自AppCompatActivity:
public class MyActivity extends AppCompatActivity { // ... }
-
布局中添加如下代碼:
<android.support.v7.widget.Toolbar android:id="@+id/my_toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
Material Design 規范建議應用欄具有 4 dp 的elevation.
-
在 Activity 的 onCreate()方法中,調用 Activity 的 setSupportActionBar()方法,然后傳遞 Activity 的工具欄。該方法會將工具欄設置為 Activity 的應用欄。例如:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(myToolbar); }
給Toolbar添加Action View & Action Providers
添加Action View
要添加Action View我們需要了解2個屬性:
actionViewClass:實現action widget的類
-
actionLayout:操作的布局
舉個例子,把SearchView 組件添加到toolbar上<item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/ic_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView" />
效果如下圖:
如果你需要配置這個action,在你的Activity的重寫方法onCreateOptionsMenu()。你可以通過 getActionView()
拿到view的引用。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_actions, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView =(SearchView) MenuItemCompat.getActionView(searchItem);
// Configure the search info and add any event listeners...
return super.onCreateOptionsMenu(menu);
}
另外,如果想單獨處理當action展開或者收縮,你可以定義一個實現MenuItem.OnActionExpandListener接口的類,然后調用setOnActionExpandListener()。如下代碼所示:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
// ...
// Define the listener
OnActionExpandListener expandListener = new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when action item collapses
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
};
// Get the MenuItem for the action item
MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);
// Assign the listener to that action item
MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);
// Any other things you have to do when creating the options menu…
return true;
}
添加Action Provider
要添加一個Action Provider,首先在資源文件res/menu/下面添加資源文件,并添加actionProviderClass屬性,然后把actionProviderClass的名字填寫完整。
舉個例子,下面代碼是聲明了一個 ShareActionProvider,功能是能夠允許你的app分享數據到其他app:
<item android:id="@+id/action_share"
android:title="@string/share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
總結
Toolbar的android api支持的操作大概也就這些,具體詳細可以參考Toolbar官方的api文檔。下面我將在關于Toolbar你需要知道的各種sao姿勢(主題篇)中介紹如何管理Toolbar的樣式。