Toolbar的使用

Toolbar是在 Android 5.0 開始推出的一個 Material Design 風格的導航控件,用來代替以之前的 ActionBar。盡管Google誠意滿滿,使用Toolbar依然是一部踩坑填坑的血淚史。

對于ToolbarGoogle給開發者留了很多可定制修改的余地。官方文檔

  • 設置導航按鍵
  • 設置程序Logo
  • 設置主/副標題
  • 設置一個或多個自定義控件
  • 支持acition menu

1. Toolbar的引入

Toolbar用來替代ActionBar,所以Activity的Theme設置成NoActionBar的例如Theme.AppCompat.Light.NoActionBar或者在代碼中去掉導航欄在onCreate()中添加supportRequestWindowFeature(Window.FEATURE_NO_TITLE)

1.1 添加兼容包依賴
Toolbar是向下兼容的,所以使用時添加support依賴包compile 'com.android.support:appcompat-v7:23.1.1'
1.2 在布局文件中引入Toolbar

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        app:navigationIcon="@drawable/ic_drawer_home"http://導航圖標
        app:logo="@mipmap/ic_launcher"http://程序logo
        app:title="Title"http://主標題
        app:subtitle="SubTitle"http://副標題>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="custom view"
            android:textColor="#fff"
            android:textSize="18sp" />

    </android.support.v7.widget.Toolbar>

1.3 在代碼中設置Toolbar替代ActionBar

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_toolbar);
        Toolbar toolbar= (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);//Toolbar 代替ActionBar

    }

程序預覽


2. 標題字體樣式的自定義

簡單的引入了Toolbar,但這并不能滿足我們的開發要求。標題的字體樣式我們總得按照設計稿來吧。

2.1 修改標題字體顏色

  app:titleTextColor="@color/colorAccent"http://修改主標題字體顏色
  app:subtitleTextColor="@color/colorAccent"http://修改副標題字體顏色

2.2 修改標題字體大小

修改字體大小就比較坑了,我沒找到設置字體大小的直接屬性??赡?code>Toolbar的設計中會自動設置標題的字體大小為一個合適的值。其實用默認的大小基本ok。如果想要修改字體大小可以嘗試下面的方法。

我在樣式文件中定義了需要樣式的父類樣式,所以后面 的樣式都沒寫parent,他們都自動繼承這個樣式

<!--Toolbar 樣式-->
    <style name="Theme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
       
    </style>

2.2.1 在styles.xml定義標題的字體樣式

  <!--Toolbar 主標題的字體和顏色-->
    <style name="Theme.Toolbar.Title">
        <item name="android:textSize">14sp</item>
        <item name="android:textColor">@color/colorAccent</item>
    </style>
    <!--Toolbar 副標題的字體和顏色-->
    <style name="Theme.Toolbar.SubTitle">
        <item name="android:textSize">12sp</item>
        <item name="android:textColor">@color/colorAccent</item>
    </style>

2.2.2 在布局文件中使用樣式

  app:subtitleTextAppearance="@style/Theme.Toolbar.SubTitle"
  app:titleTextAppearance="@style/Theme.Toolbar.Title"

3. Action Menu的添加

由于上面已經通過setSupportActionBar(toolbar)Toolbar設置成了程序的ActionBar。菜單布局的渲染和菜單按鍵的監聽可以直接在Activity的回調方法中實現
3.1 創建菜單布局文件

<?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/menu1"
        android:icon="@drawable/ic_search"
        android:title="menu1"
        app:showAsAction="always" />
    <item
        android:id="@+id/menu2"
        android:icon="@drawable/ic_notifications"
        android:title="menu2"
        app:showAsAction="never" />
</menu>

3.2 加載菜單布局文件

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

3.3 設置菜單點擊回調監聽

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu1:
                Toast.makeText(ToolbarActivity.this, "item1:" + item.getTitle().toString(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu2:
                Toast.makeText(ToolbarActivity.this, "item2" + item.getTitle().toString(), Toast.LENGTH_SHORT).show();
                break;

        }
        return super.onOptionsItemSelected(item);
    }

4. Action Menu樣式的自定義

如圖預覽所示,這里會有下面幾個問題:

  1. 顯示更多菜單按鍵由系統生成和其他圖標不符
  2. 菜單彈窗背景字體樣式等的自定義
  3. 菜單彈窗中子菜單項圖標沒有顯示(運行到手機也沒顯示)

4.1 顯示更多菜單圖標的替換

4.1.1 在styles.xml樣式文件中定義Toolbar的樣式

  <!--Toolbar 樣式-->
    <style name="Theme.Toolbar" parent="ThemeOverlay.AppCompat.ActionBar">
        <item name="actionOverflowButtonStyle">@style/Toolbar_action_menu</item>
    </style>
    <!--更多菜單圖標-->
    <style name="Toolbar_action_menu">
        <item name="android:src">@drawable/ic_menu_more_overflow</item>
    </style>

4.1.2 在布局文件中為Toolbar指定樣式文件

 android:theme="@style/Theme.Toolbar"

4.2 菜單彈窗背景、字體的自定義

4.2.1 在styles.xml樣式文件中定義Toolbar菜單的樣式

  <!--菜單上文字的大小和顏色-->
    <style name="Theme.Toolbar.PopMenu">
        <item name="android:textSize">18sp</item>
        <item name="android:textColor">@color/colorAccent</item>
        <item name="android:background">@color/cl_1B2137</item>
    </style>

4.1.2 在布局文件中為Toolbar彈窗菜單指定樣式文件

  app:popupTheme="@style/Theme.Toolbar.PopMenu"

4.3 菜單彈窗子菜單圖標不顯示解決方案

4.3.1 添加菜單顯示的方法

//設置菜單選項圖標是否顯示
    private void setIconEnable(Menu menu, boolean enable) {
        if (menu != null) {
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, enable);
                } catch (Exception e) {
                }
            }
        }
    }

4.3.2 在創建菜單的時候設置圖標是否顯示

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

在手機上運行顯示截圖如下


5. 關于主標題的顯示問題

因為在代碼中通過setSupportActionBar(toolbar);Toolbar設置成了ActionBar,所以如果沒有沒置Toolbar的主標題,或者主標題設置為了空app:title="",系統會獲取Activitylable字段設置為主標題。如果Activitylable為空則會獲取applicationlabel字段設置title。解決這個問題需要在代碼中添加getSupportActionBar().setDisplayShowTitleEnabled(false);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容