Android5.0之Toobar的使用

來源:互聯網
上載者:User

標籤:

總體上來說,Toolbar的使用可以分為兩個方面,一方面是將ToolBar當作ActionBar來用,另一方面就是將Toolbar當成一個單獨的控制項來用,不過到目前為止我見到的大部分情況都是把Toolbar當作ActionBar來用,下面我們分別就這兩種使用方式來進行說明。

1.Toolbar作為ActionBar使用

將Toolbar當作ActionBar使用首先要隱藏系統預設的ActionBar,隱藏方式其實很簡單,只需要簡單設定一下style就可以了,如下了:

    <style name="AppTheme.NoActionBar">        <item name="android:windowActionBar">false</item>        <item name="android:windowNoTitle">true</item>        <item name="windowActionBar">false</item>        <item name="windowNoTitle">true</item>    </style>

Android手機在3.0之前標題列叫做titlebar,3.0之後又推出了ActionBar來代替titlebar,所以我們在使用的Toolbar的時候為了相容早期的手機也要把titlebar隱藏掉。這兩個東東都隱藏之後,在資訊清單檔中給Activity或者App設定一下主題就可以了,我這裡給Activity設定主題,如下:

        <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">            <intent-filter>                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>        </activity>

如此,我的MainActivity就成功的隱藏掉了ActionBar了,接下來就是怎麼添加Toolbar了,我們知道在企業開發中ActionBar使用並不多,一個重要的原因就是這個東西太死板了,而且太醜了,那麼Google推出Toolbar必然就要避免這些問題,so,Toolbar除了好看另一個最大的優點就是靈活,你完全可以把它當作一個普普通通的控制項來使用,普通控制項怎麼使用呢?先在布局檔案中寫唄,同時,我們為了相容Android5.0之前的手機,在使用Toolbar的時候都是使用v7包裡的Toolbar,布局檔案如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="org.mobiletrain.toolbar2.MainActivity">    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="?attr/actionBarSize"        android:background="@color/colorPrimary"        android:popupTheme="@style/AppTheme.PopupOverlay">    </android.support.v7.widget.Toolbar></LinearLayout>

OK,是不是很簡單呢?一個簡單的布局檔案就搞定了,那麼這裡有三個地方需要給大家解釋一下,首先是toolbar的高,你可以給一個固定值,也可以參考之前ActionBar的高度,參考ActionBar高度的好處是系統會在不同的裝置上自動為你調整Toolbar的高度。第二點就是background屬性,使用toolbar時我們可以給toolbar設定一個背景顏色。第三就是popupTheme屬性,就是彈出框的顯示,這裡我們一般按如下的方式來設定:

<style name="AppTheme.PopupOverlay" parent="Theme.AppCompat.Light">

OK,布局檔案搞定之後,下來我們就來看看在MainActivity中該怎麼處理:

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        toolbar.setTitle("主標題");        toolbar.setSubtitle("二級標題");        //設定應用Logo        toolbar.setLogo(R.drawable.a5k);        //設定互動中心圖示        toolbar.setNavigationIcon(R.drawable.ic_menu_back);        //用ToolBar代替ActionBar        setSupportActionBar(toolbar);

在布局檔案中我們還是像處理普通控制項一樣,先是獲得到這個Toolbar,然後給toolbar設定各種屬性,至於這些屬性具體指什麼大家看下面一張圖就明白了(a5k是中的圖片,ic_menu_back是一個向前的箭頭):

可是這個導航箭頭太醜了,其實這裡我們用系統預設的箭頭就可以了,設定方式如下:

        //設定互動中心圖示//        toolbar.setNavigationIcon(R.drawable.ic_menu_back);        //用ToolBar代替ActionBar        setSupportActionBar(toolbar);        //顯示導覽按鈕並使之處於可點擊狀態        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


大家注意這裡要注釋掉之前設定互動中心圖示的代碼,同時getSupportActionBar().setDisplayHomeAsUpEnabled(true);要放在setSupportActionBar(toolbar);這個之後執行,因為真正的ActionBar已經被我們隱藏了,在用toolbar代替actionbar之前如果調用getSupportActionBar()會無法擷取ActionBar。這樣做之後,顯示效果如下:

這個預設的後退按鈕比起ActionBar中的後退按鈕漂亮多了吧。如果你用過ActionBar裡邊的後退按鈕你就會知道它有多醜。

OK,接下來,如果我想要在Toolbar上顯示功能表項目該怎麼辦呢?以前ActionBar的時候你怎麼辦現在還怎麼辦!

先寫菜單檔案,如下:

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:app="http://schemas.android.com/apk/res-auto">    <item        android:id="@+id/setting"        android:icon="@drawable/a5k"        android:orderInCategory="99"        android:title="setting"        app:showAsAction="never"/>    <item        android:id="@+id/search"        android:title="search"        app:actionViewClass="android.support.v7.widget.SearchView"        app:showAsAction="always"/>    <item        android:id="@+id/share"        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"        app:showAsAction="never"        android:title="share"></item></menu>

大家注意這裡有兩個地方和以前不一樣,一個就是showAsAction的命名空間變為了自訂的app,還有就是actionViewClass和actionProviderClass的命名空間也變為app。OK,菜單檔案寫完之後,在Activity中建立菜單即可,如下:

    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.main, menu);        return super.onCreateOptionsMenu(menu);    }

和以前建立菜單的方式一模一樣,我們再來看看顯示效果:

貌似沒有什麼難度,然後菜單事件的處理依然在onOptionsItemSelected方法中,如下:

    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case android.R.id.home:                Log.d("lenve", "onOptionsItemSelected() returned: " + 456);                break;        }        return super.onOptionsItemSelected(item);    }

2.單獨使用Toolbar

你既可以把Toolbar當作ActionBar來用,也可以當作普通控制項來用,雖然這種用法比較少見。當作普通控制項來用的話,那我就沒有必要隱藏ActionBar了(不給新的Activity在資訊清單檔中設定我們在文章開頭建立的AppTheme.NoActionBar主題即可)。那我依然是先在布局檔案中來寫一個Toolbar,不同的是,這次我把它放在螢幕的正中央,代碼如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="org.mobiletrain.toolbar2.Main2Activity">    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:layout_height="?attr/actionBarSize"        android:layout_centerInParent="true"        android:background="@color/colorPrimary"        android:popupTheme="@style/AppTheme.PopupOverlay">    </android.support.v7.widget.Toolbar></RelativeLayout>

顯示效果如下:

OK,Toolbar已經顯示在螢幕正中央了,但是既然把它當作一個普通控制項來使用,我們在怎麼向Toolbar中添加功能表項目呢?如下,需要Toolbar自己載入:

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        toolbar.inflateMenu(R.menu.main);    }

顯示效果如下:

OK,接下來一個問題是怎麼給這些控制項設定點擊事件呢,如下:

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {            @Override            public boolean onMenuItemClick(MenuItem item) {                switch (item.getItemId()) {                    case R.id.search:                        Log.d("lenve", "onMenuItemClick() returned: search");                        break;                    case R.id.setting:                        Log.d("lenve", "onMenuItemClick() returned: setting");                        break;                    case R.id.share:                        Log.d("lenve", "onMenuItemClick() returned: share");                        break;                }                return true;            }        });

OK,基本Toolbar的使用就是這樣的。

Android5.0之Toobar的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.