ToolBar使用

ToolBar

基本使用

Toolbar是在Android5.0開始推出的一個MaterialDesign風(fēng)格的導(dǎo)航控件,Google非常推薦大家使用Toolbar 來作為Android客戶端的導(dǎo)航欄,以此來取代之前的Actionbar。與Actionbar相比,Toolbar明顯要靈活的多。它不像Actionbar一樣,一定要固定在Activity的頂部,而是可以放到界面的任意位置。

Toobar是Android5.0才引入的,Google也在兼容包appcompat-v7中提供了向下兼容的ToolBar:android.support.v7.widget.Toolbar

首先,我們要在build.gradle中添加依賴。

compile 'com.android.support:appcompat-v7:24.2.0'

接著,禁用掉主題提供的actionbar。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

然后我們就可以在布局文件中添加ToolBar。ToolBar相對于其它控件,并沒有什么特殊之處,添加ToolBar和添加其它控件一樣。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        app:titleTextColor="@android:color/white"/>
</LinearLayout>

最后,在Activity或者Fragment中,通過調(diào)用setSupportActionBar讓ToolBar扮演ActionBar的角色。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
}

一旦設(shè)置了Toolbar作為activity的actionbar,就可以調(diào)用ActionBar類提供的方法來設(shè)置ActionBar。ActionBar常用的方法:

  • hide():隱藏ActionBar
  • show():顯示ActionBar
  • isShowing():判斷ActionBar是否顯示
  • setBackgroundDrawable(Drawable drawable):為ActionBar設(shè)置背景。
  • setDisplayHomeAsUpEnabled(boolean b):是否顯示返回的按鈕。
  • setDisplayShowHomeEnabled(boolean b);是否顯示icon
  • setDisplayShowTitleEnabled(boolean b);是否顯示標(biāo)題
  • setDisplayShowCustomEnabled(boolean b);是否顯示自定義view
  • setIcon();設(shè)置Icon
  • setTitle();設(shè)置標(biāo)題
  • getSelectedNavigationIndex()獲取選擇條目的索引。

添加Action Buttons

當(dāng)你開啟Activity時,系統(tǒng)通過調(diào)用Activity的onCreateOptionsMenu()方法來放置action buttons。使用這個方法inflate一個定義所有action buttons的菜單資源。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search_white_24dp"
        android:title="@string/action_search"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_add_alarm"
        android:icon="@drawable/ic_add_alarm_white_24dp"
        android:title="@string/action_alarm"
        app:showAsAction="ifRoom"/>
</menu>

然后調(diào)用Activity的onCreateOptionsMenu()方法中添加將所有的action button添加到ActionBar上。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}

想要item直接顯示在actionbar上,需要在標(biāo)簽中,添加一個showAsAction="ifRoom"屬性。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/action_search"
          yourapp:showAsAction="ifRoom"  />
    ...
</menu>

如果沒有足夠的空間,它將以懸浮菜單的樣式顯示。

注意上面的showAsAction 屬性使用了一個自定義命名空間。在使用supportlibrary定義的屬性必須自定義命名空間。因為這些屬性在一些老的Android設(shè)備上不存在。

如果同時指定了title和icon屬性,action item默認(rèn)只顯示icon.如果需要顯示標(biāo)題,需要為showAsAction屬性添加withText值,如果icon可用并且actionbar空間不足時,title將不顯示。

<item yourapp:showAsAction="ifRoom|withText" ... />

盡管可能你不需要顯示title,但是仍然要指定title屬性的值。

  • 如果空間不足,菜單將以懸浮狀態(tài)顯示,并且只顯示title。
  • 如果action item只顯示icon,用戶可以通過長按條目顯示title。

你也可以設(shè)置showAsAction屬性的值為always,讓一個actionitem一直顯示,但是你最好不要讓一個action item一直顯示。這樣做在窄屏上出現(xiàn)一些布局適配的問題。

處理條目點擊

當(dāng)用戶點擊一個條目時,系統(tǒng)將點擊的MenuItem傳遞給Activity的onOptionsItemSelected() 方法。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.action_search:
            Toast.makeText(this, "點擊了搜索", Toast.LENGTH_SHORT).show();
            return true;
        case R.id.action_add_alarm:
            Toast.makeText(this, "點擊了添加鬧鐘", Toast.LENGTH_SHORT).show();
            return true;
        //向上返回的按鈕的id是android.R.id.home 所以通過下面代碼就能實現(xiàn)點擊返回按鈕返回的功能。
        case android.R.id.home:
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

添加Action View

Action View 提供了一些復(fù)雜操作的快速入口,不需要改變Acitivity或者Fragment,并且不用替換ActionBar.例如,如果你想進(jìn)行搜索,你可以通過給actionbar添加一個SearchView組件來實現(xiàn)。

我們可以通過給acionlayout屬性指定一個布局資源或者給actionViewClass屬性指定一個組件類來添加一個Action View.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search_white_24dp"
        android:title="@string/action_search"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.support.v7.widget.SearchView"/>
    <item
        android:id="@+id/action_add_alarm"
        android:icon="@drawable/ic_add_alarm_white_24dp"
        android:title="@string/action_alarm"
        app:showAsAction="ifRoom"/>
</menu>

注意showAsAction屬性包含了一個collapseActionView值。

我們可以在onCreateOptionsMenu()方法中配置action view。通過靜態(tài)方法MenuItemCompat.getActionView()可以獲取一個到action view對象。這個方法需要傳遞一個MenuItem對象。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {//進(jìn)行搜索
            Toast.makeText(MainActivity.this, "搜索"+query, Toast.LENGTH_SHORT).show();
            return false;
        }
        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

處理可折疊的Action View

為了節(jié)省action bar的空間,可以將action view折疊成一個action button。當(dāng)這個action button被選中時,action view將會被展開。只要為showAsAction屬性添加一個collapseActionView值就可以讓action view變的可折疊。

當(dāng)用戶點擊action button,action view能夠自動的展開,不需要在onOptionsItemSelected()方法中進(jìn)行點擊處理。但是如果將其返回值設(shè)置為true,action view將不會被展開。

當(dāng)點下手機(jī)的返回按鈕或者action bar的返回按鈕,action view將會被折疊。

通過OnActionExpandListener監(jiān)聽器,可以監(jiān)聽到action view折疊和展開。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            Toast.makeText(MainActivity.this, "折疊", Toast.LENGTH_SHORT).show();
            return true;
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            Toast.makeText(MainActivity.this, "展開", Toast.LENGTH_SHORT).show();
            return true;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

添加 Action Provider

類似action view,action provider通過自定義布局來替換一個操作按鈕.但是action provider控制所有的動作行為并且在被點擊時能夠顯示一個子菜單。

通過為actionViewClass屬性設(shè)置一個ActionProvider類,來添加action provider.也可以通過繼承ActionProvider來創(chuàng)建自定義的action provider.Android提供了一些action provider,例如ShareActionProvider。

由于每一個ActionProvider類定義自己的動作行為,所以不需要通過onOptionsItemSelected()方法來設(shè)置其點擊事件,但是你仍然可以通過此方法來設(shè)置其他操作,也可以通過onPerformDefaultAction()來設(shè)置別的操作。

如果action Provider提供一個子菜單,用戶打開列表或者選中一個子菜單,activity將不調(diào)用onOptionsItemSelected()。

使用ShareActionProvider添加一個分享操作需要一下步驟:
1.設(shè)置actionProviderClass屬性值為ShareActionProvider類.

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search_white_24dp"
        android:title="@string/action_search"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.support.v7.widget.SearchView"/>
    <item
        android:id="@+id/action_share"
        android:icon="@drawable/ic_share_white_24dp"
        android:title="@string/action_share"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        app:showAsAction="ifRoom"/>
</menu>

2.定義你想要分享的Intent。在onCreateOptionsMenu()方法中調(diào)用MenuItemCompat.getActionProvider()獲取ShareActionProvider對象,然后調(diào)用ShareActionProvider的setShareIntent()設(shè)置分享意圖。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    MenuItem shareItem = menu.findItem(R.id.action_share);
    ShareActionProvider shareActionProvider = (ShareActionProvider)
            MenuItemCompat.getActionProvider(shareItem);
    shareActionProvider.setShareIntent(getDefaultIntent());
    return super.onCreateOptionsMenu(menu);
}

private Intent getDefaultIntent() {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    return intent;
}
創(chuàng)建自定義的ActionProvider

要創(chuàng)建自定義的ActionProvider只需要簡單的繼承ActionProvider類,并且實現(xiàn)下列方法。

OnCreateActionView()這個方法用來獲取action view。使用從構(gòu)造器中接收的Context對象,獲取一個LayoutInflater對象的實例,并且用XML資源來填充操作視窗,然后注冊事件監(jiān)聽器。

public View onCreateActionView(MenuItem forItem) {
    // Inflate the action view to be shown on the action bar.
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    View view = layoutInflater.inflate(R.layout.action_provider, null);
    ImageButton button = (ImageButton) view.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do something...
        }
    });
    return view;
}

onPerformDefaultAction()在選中懸浮菜單中的菜單時,系統(tǒng)會調(diào)用這個方法,并且操作提供器應(yīng)該這對這個選中的菜單項執(zhí)行默認(rèn)的操作。但是,如果你的操作提供器提供了一個子菜單,即使是懸浮菜單中一個菜單項的子菜單,那么也要通過onPrepareSubMenu()回調(diào)方法來顯示子菜單。這樣onPerformDefaultAction()在子菜單顯示時就不會被調(diào)用。注意:實現(xiàn)了onOptionsItemSelected()回調(diào)方法的Activity或Frament對象能夠通過處理item-selected事件(并且返回true)來覆蓋操作提供器的默認(rèn)行為,這種情況下,系統(tǒng)不會調(diào)用onPerformDefaultAction()方法。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容