Android 5.x Theme 與 ToolBar 實戰

發表於2015-05-10

1、概述

隨著Material Design的逐漸的普及,業內也有很多具有分享精神的夥伴翻譯了material design specification ,中文翻譯地址:Material Design 中文版。So,我們也開始Android 5.x相關的blog,那麼首先了解的當然是其主題的風格以及app bar。

當然,5.x普及可能還需要一段時間,所以我們還是儘可能的去使用相容包支援低版本的裝置。

ps:本部落格使用:

  • compileSdkVersion 22
  • buildToolsVersion “22.0.1”
  • compile ‘com.android.support:appcompat-v7:22.1.1’
  • 忽然發現ActionBarActivity被棄用了,推薦使用AppCompatActivity,相關blog地址:Android Support Library 22.1

2、Material Design的Theme

md的主題有:

  • @android:style/Theme.Material (dark version)
  • @android:style/Theme.Material.Light (light version)
  • @android:style/Theme.Material.Light.DarkActionBar

與之對應的Compat Theme:

  • Theme.AppCompat
  • Theme.AppCompat.Light
  • Theme.AppCompat.Light.DarkActionBar

(1)個性化 Color Palette

我們可以根據我們的app的風格,去定製Color Palette(調色盤),重點有以下幾個屬性:

  • colorPrimary 對應ActionBar的顏色。
  • colorPrimaryDark對應狀態列的顏色
  • colorAccent 對應EditText編輯時、RadioButton選中、CheckBox等選中時的顏色。

與之對應的圖:

metarial design的theme允許我們去設定status bar的顏色,如果你專案的最小支援版本為5.0,那麼你可以使用android:Theme.Material,設定android:statusBarColor。當然了這種情況目前來說比較少,所以我們多數使用的是Theme.AppCompat,通過設定android:colorPrimaryDark.來設定status bar顏色。(ps:預設情況下,android:statusBarColor的值繼承自android:colorPrimaryDark).

對於5.0以下的裝置,目前colorPrimaryDark無法去個性化狀態列的顏色;底部的navagationBar可能也不一樣,更別說設定顏色了。

下面寫個簡單的Demo去測試下。

(2)測試效果

values/styles.xml

values-v21/styles.xml

values/colors.xml

可以看到:colorAccent也就是圖中的粉色,EditText正在輸入時,RadioButton選中時的顏色。ps:5.0以下裝置,狀態列顏色不會變化。

3、ToolBar的使用

眾所周知,在使用ActionBar的時候,一堆的問題:這個文字能不能定製,位置能不能改變,圖示的間距怎麼控制神馬的,由此暴露出了ActionBar設計的不靈活。為此官方提供了ToolBar,並且提供了supprot library用於向下相容。Toolbar之所以靈活,是因為它其實就是一個ViewGroup,我們在使用的時候和普通的元件一樣,在佈局檔案中宣告。

(1)ToolBar的引入

既然準備用ToolBar,首先看看如何將其引入到app中。

1)隱藏原本的ActionBar

隱藏可以通過修改我們繼承的主題為:Theme.AppCompat.Light.NoActionBar,當然也可以通過設定以下屬性完成:

我們這裡選擇前者:

2)在佈局檔案中宣告

ok,這裡我們也貼出來上面圖片的效果的xml,使用GridLayout實現的,有興趣的可以研究下。可以看到我們在佈局檔案中定義了ToolBar。

3)程式碼中設定

ok,基本就是先隱藏ActionBar,然後在佈局檔案中宣告,最後程式碼中設定一下。現在看一下效果圖:

可以看到我們的ToolBar顯示出來了,預設的Title為ToolBar,但是這個樣式實在是不敢恭維,下面看我們如何定製它。

(2)定製ToolBar

首先給它一個nice的背景色,還記得前面的colorPrimary麼,用於控制ActionBar的背景色的。當然這裡我們的ToolBar就是一個普通的ViewGroup在佈局中,所以我們直接使用background就好,值可以為:?attr/colorPrimary使用主題中定義的值。

ToolBar中包含Nav Icon , Logo , Title , Sub Title , Menu Items 。

我們可以通過程式碼設定上述ToolBar中的控制元件:

可選方案當然如果你喜歡,也可以在佈局檔案中去設定部分屬性:

至於Menu Item,依然支援在menu/menu_main.xml去宣告,然後複寫onCreateOptionsMenuonOptionsItemSelected即可。

可選方案也可以通過toolbar.setOnMenuItemClickListener實現點選MenuItem的回撥。

效果圖:

關於字型的樣式,可以在佈局檔案設定屬性app:titleTextAppearanceapp:subtitleTextAppearance或者程式碼setTitleTextAppearancesetSubTitleTextAppearance設定。

4、實戰

簡單介紹了Toolbar以後呢,我們決定做點有意思的事,整合ToolBar,DrawerLayout,ActionBarDrawerToggle寫個實用的例子,效果圖如下:

ok,簡單處理了下橫縱螢幕的切換。接下來看程式碼實現。

  • 大致思路

整體實現還是比較容易的,首先需要引入DrawerLayout(如果你對DrawerLayout不瞭解,可以參考
Android DrawerLayout 高仿QQ5.2雙向側滑選單),然後去初始化mActionBarDrawerToggle,mActionBarDrawerToggle實際上是個DrawerListener,設定mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);就已經能夠實現上面點選Nav Icon切換效果了。當然了細節還是挺多的。

我們的效果圖,左側選單為Fragment,內容區域為Fragment,點選左側選單切換內容區域的Fragment即可。關於Fragment的知識,可以檢視:Android Fragment 你應該知道的一切

  • 佈局檔案
    activity_main.xml

DrawerLayout中包含兩個FrameLayout,分別放內容區域和左側選單的Fragment。

  • LeftMenuFragment

繼承自ListFragment,主要用於展示各個Item,提供了一個選擇Item的回撥,這個需要在Activity中去註冊處理。

  • LeftMenuAdapter

Adapter沒撒說的~~提供了一個setSection方法用於設定選中Item的樣式什麼的。
接下來看ContentFragment,僅僅只是一個TextView而已,所以程式碼也比較easy。

提供newInstance接收一個title引數去例項化它。

最後就是我們的MainActivity了,負責管理各種Fragment。

  • MainActivity

內容區域的切換是通過Fragment hide和show實現的,畢竟如果用replace,如果Fragment的view結構比較複雜,可能會有卡頓。當然了,注意每個Fragment佔據的記憶體情況,如果記憶體不足,可能需要改變實現方式。
對於旋轉螢幕或者應用長時間置於後臺,Activity重建的問題,做了簡單的處理。

對了,寫佈局的時候,可以儘可能的去考慮 Material design 的規範。

5、參考資料

相關文章