天天看點

自定義ActionBar的風格 & ActionBar的覆寫疊加自定義ActionBar的風格

自定義ActionBar的風格

編寫:Vincent 4J - 原文:http://developer.android.com/training/basics/actionbar/styling.html

Action bar 為使用者提供一種熟悉可預測的方式來展示操作和導航,但是這并不意味着你的 app 要看起來和其他 app 一樣。如果你想将 action bar 的風格設計的合乎你産品的定位,你隻需簡單地使用 Android 的 樣式和主題 資源。

Android 包括一少部分内置的 activity 主題,這些主題中包含 “暗” 或 “淡” 的 action bar 樣式。你也可以擴充這些主題,以便于更好的為你的 action bar 自定義外觀。

Note:如果你為 action bar 使用了 Support 庫的 API,那你必須使用(或重寫)Theme.AppCompat 家族樣式(甚至 Theme.Holo 家族,在 API level 11 或更高版本中可用)。如此一來,你聲明的每一個樣式屬性都必須被聲明兩次:一次使用系統平台的樣式屬性(android:屬性),另一次使用 Support 庫中的樣式屬性(appcompat.R.attr 屬性 - 這些屬性的上下文其實就是你的 app)。更多細節請檢視下面的示例。

使用一個 Android 主題

Android 包含兩個基本的 activity 主題,這兩個主題決定了 action bar 的顔色:

  • Theme.Holo,一個 “暗” 的主題
  • Theme.Holo.Light,一個 “淡” 的主題
自定義ActionBar的風格 & ActionBar的覆寫疊加自定義ActionBar的風格
自定義ActionBar的風格 & ActionBar的覆寫疊加自定義ActionBar的風格

這些主題即可以被應用到 app 全局,又可以為單一的 activity 通過在 manifest 檔案中設定

<application>

 元素 或 

<activity>

 元素的 

android:theme

 屬性。

例如:

你可以通過聲明 activity 的主題為 Theme.Holo.Light.DarkActionBar 來達到如下效果:action bar 為暗色,其他部分為淡色。

自定義ActionBar的風格 &amp; ActionBar的覆寫疊加自定義ActionBar的風格

當使用 Support 庫時,必須使用 Theme.AppCompat 主題替代:

  • Theme.AppCompat,一個“暗”的主題
  • Theme.AppCompat.Light,一個“淡”的主題
  • Theme.AppCompat.Light.DarkActionBar,一個帶有“暗” action bar 的“淡”主題

一定要確定你使用的 action bar icon 的顔色與 action bar 本身的顔色有差異。為了能幫助到你,Action Bar Icon Pack 為 Holo “暗”和“淡”的 action bar 提供了标準的 action icon。

自定義背景

為 activity 建立一個自定義主題,通過重寫 actionBarStyle 屬性來改變 action bar 的背景。actionBarStyle 屬性指向另一個樣式;在該樣式裡,通過指定一個 drawable 資源來重寫background 屬性。

自定義ActionBar的風格 &amp; ActionBar的覆寫疊加自定義ActionBar的風格

如果你的 app 使用了 navigation tabs 或 split action bar ,你也可以通過分别設定backgroundStacked 和 backgroundSplit 屬性來為這些條指定背景。

Note:為你的自定義主題和樣式聲明一個合适的父主題,這點很重要。如果沒有父樣式,你的action bar将會失去很多預設的樣式屬性,除非你自己顯式的對他們進行聲明。

僅支援 Android 3.0 和更高

當僅支援 Android 3.0 和更高版本時,你可以像下面這樣定義 action bar 的背景:

res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 應用于程式或者活動的主題 -->
    <style name="CustomActionBarTheme"
           parent="@android:style/Theme.Holo.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
    </style>

    <!-- ActionBar 樣式 -->
    <style name="MyActionBar"
           parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@drawable/actionbar_background</item>
    </style>
</resources>
           

然後,将你的主題應該到你的 app 全局或單個的 activity 之中:

支援 Android 2.1 和更高

當使用 Support 庫時,上面同樣的主題必須被替代成如下:

res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 應用于程式或者活動的主題 -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>

        <!-- 支援庫相容 -->
        <item name="actionBarStyle">@style/MyActionBar</item>
    </style>

    <!-- ActionBar 樣式 -->
    <style name="MyActionBar"
           parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@drawable/actionbar_background</item>

        <!-- 支援庫相容 -->
        <item name="background">@drawable/actionbar_background</item>
    </style>
</resources>
           

然後,将你的主題應該到你的 app 全局或單個的 activity 之中:

自定義文本顔色

修改 action bar 中的文本顔色,你需要分别重寫每個元素的屬性:

  • Action bar 的标題:建立一種自定義樣式,并指定 

    textColor

     屬性;同時,在你的自定義actionBarStyle 中為 titleTextStyle 屬性指定為剛才的自定義樣式。
    Note:被應用到 titleTextStyle 的自定義樣式應該使用TextAppearance.Holo.Widget.ActionBar.Title 作為父樣式。
  • Action bar tabs:在你的 activity 主題中重寫 actionBarTabTextStyle
  • Action 按鈕:在你的 activity 主題中重寫 actionMenuTextColor

僅支援 Android 3.0 和更高

當僅支援 Android 3.0 和更高時,你的樣式 XML 檔案應該是這樣的:

res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 應用于程式或者活動的主題 -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.Holo">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
        <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
        <item name="android:actionMenuTextColor">@color/actionbar_text</item>
    </style>

    <!-- ActionBar 樣式 -->
    <style name="MyActionBar"
           parent="@style/Widget.Holo.ActionBar">
        <item name="android:titleTextStyle">@style/MyActionBarTitleText</item>
    </style>

    <!-- ActionBar 标題文本 -->
    <style name="MyActionBarTitleText"
           parent="@style/TextAppearance.Holo.Widget.ActionBar.Title">
        <item name="android:textColor">@color/actionbar_text</item>
    </style>

    <!-- ActionBar Tab标簽 文本樣式 -->
    <style name="MyActionBarTabText"
           parent="@style/Widget.Holo.ActionBar.TabText">
        <item name="android:textColor">@color/actionbar_text</item>
    </style>
</resources>
           

支援 Android 2.1 和更高

當使用 Support 庫時,你的樣式 XML 檔案應該是這樣的:

res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 應用于程式或者活動的主題 -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.AppCompat">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
        <item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item>
        <item name="android:actionMenuTextColor">@color/actionbar_text</item>

        <!-- 支援庫相容 -->
        <item name="actionBarStyle">@style/MyActionBar</item>
        <item name="actionBarTabTextStyle">@style/MyActionBarTabText</item>
        <item name="actionMenuTextColor">@color/actionbar_text</item>
    </style>

    <!-- ActionBar 樣式 -->
    <style name="MyActionBar"
           parent="@style/Widget.AppCompat.ActionBar">
        <item name="android:titleTextStyle">@style/MyActionBarTitleText</item>

        <!-- 支援庫相容 -->
        <item name="titleTextStyle">@style/MyActionBarTitleText</item>
    </style>

    <!-- ActionBar 标題文本 -->
    <style name="MyActionBarTitleText"
           parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title">
        <item name="android:textColor">@color/actionbar_text</item>
        <!-- 文本顔色屬性textColor是可以配合支援庫向後相容的 -->
    </style>

    <!-- ActionBar Tab标簽文本樣式 -->
    <style name="MyActionBarTabText"
           parent="@style/Widget.AppCompat.ActionBar.TabText">
        <item name="android:textColor">@color/actionbar_text</item>
        <!-- 文本顔色屬性textColor是可以配合支援庫向後相容的 -->
    </style>
</resources>
           

自定義 Tab Indicator

為 activity 建立一個自定義主題,通過重寫 actionBarTabStyle 屬性來改變 navigation tabs 使用的訓示器。actionBarTabStyle 屬性指向另一個樣式資源;在該樣式資源裡,通過指定一個state-list drawable 來重寫 background 屬性。

自定義ActionBar的風格 &amp; ActionBar的覆寫疊加自定義ActionBar的風格
Note:一個state-list drawable 是重要的,它可以通過不同的背景來指出目前選擇的 tab 與其他 tab 的差別。更多關于如何建立一個 drawable 資源來處理多個按鈕狀态,請閱讀 State List 文檔。

例如,這是一個狀态清單 drawable,為一個 action bar tab 的多種不同狀态分别指定背景圖檔:

res/drawable/actionbar_tab_indicator.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 按鈕沒有按下的狀态 -->

    <!-- 沒有焦點的狀态 -->
    <item android:state_focused="false" android:state_selected="false"
          android:state_pressed="false"
          android:drawable="@drawable/tab_unselected" />
    <item android:state_focused="false" android:state_selected="true"
          android:state_pressed="false"
          android:drawable="@drawable/tab_selected" />

    <!-- 有焦點的狀态 (例如D-Pad控制或者滑鼠經過) -->
    <item android:state_focused="true" android:state_selected="false"
          android:state_pressed="false"
          android:drawable="@drawable/tab_unselected_focused" />
    <item android:state_focused="true" android:state_selected="true"
          android:state_pressed="false"
          android:drawable="@drawable/tab_selected_focused" />


<!--  按鈕按下的狀态D -->

    <!-- 沒有焦點的狀态 -->
    <item android:state_focused="false" android:state_selected="false"
          android:state_pressed="true"
          android:drawable="@drawable/tab_unselected_pressed" />
    <item android:state_focused="false" android:state_selected="true"
        android:state_pressed="true"
        android:drawable="@drawable/tab_selected_pressed" />

    <!--有焦點的狀态 (例如D-Pad控制或者滑鼠經過)-->
    <item android:state_focused="true" android:state_selected="false"
          android:state_pressed="true"
          android:drawable="@drawable/tab_unselected_pressed" />
    <item android:state_focused="true" android:state_selected="true"
          android:state_pressed="true"
          android:drawable="@drawable/tab_selected_pressed" />
</selector>
           

僅支援 Android 3.0 和更高

當僅支援 Android 3.0 和更高時,你的樣式 XML 檔案應該是這樣的:

res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 應用于程式或活動的主題 -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.Holo">
        <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>
    </style>

    <!-- ActionBar tabs 标簽樣式 -->
    <style name="MyActionBarTabs"
           parent="@style/Widget.Holo.ActionBar.TabView">
        <!-- 标簽訓示器 -->
        <item name="android:background">@drawable/actionbar_tab_indicator</item>
    </style>
</resources>
           

支援 Android 2.1 和更高

當使用 Support 庫時,你的樣式 XML 檔案應該是這樣的:

res/values/themes.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 應用于程式或活動的主題 -->
    <style name="CustomActionBarTheme"
           parent="@style/Theme.AppCompat">
        <item name="android:actionBarTabStyle">@style/MyActionBarTabs</item>

        <!-- 支援庫相容 -->
        <item name="actionBarTabStyle">@style/MyActionBarTabs</item>
    </style>

    <!-- ActionBar tabs 樣式 -->
    <style name="MyActionBarTabs"
           parent="@style/Widget.AppCompat.ActionBar.TabView">
        <!-- 标簽訓示器 -->
        <item name="android:background">@drawable/actionbar_tab_indicator</item>

        <!-- 支援庫相容 -->
        <item name="background">@drawable/actionbar_tab_indicator</item>
    </style>
</resources>
           

ActionBar的覆寫疊加

編寫:Vincent 4J - 原文:http://developer.android.com/training/basics/actionbar/overlaying.html

預設情況下,action bar 顯示在 activity 視窗的頂部,會稍微地減少其他布局的有效空間。如果在使用者互動過程中你要隐藏和顯示 action bar,可以通過調用 ActionBar 中的 hide()和show()來實作。但是,這将會導緻 activity 基于新尺寸重新計算與繪制布局。

為了避免在 action bar 隐藏和顯示過程中調整布局的大小,可以為 action bar 啟用疊加模式(overlay mode)。在疊加模式下,所有可用的空間都會被用來布局就像ActionBar不存在一樣,并且 action bar 會疊加在你的布局之上。這樣布局頂部就會有點被遮擋,但當 action bar 隐藏或顯示時,系統不再需要調整布局而是無縫過渡。

Note:如果你希望 action bar 下面的布局部分可見,可以建立一個背景部分透明的自定義式樣的 action bar,如圖 1 所示。如何定義 action bar 的背景,請檢視 自定義ActionBar的風格。
自定義ActionBar的風格 &amp; ActionBar的覆寫疊加自定義ActionBar的風格

圖 1. 疊加模式下的 gallery action bar

啟用疊加模式(Overlay Mode)

要為 action bar 啟用疊加模式,需要自定義一個主題,該主題繼承于已經存在的 action bar 主題,并設定 

android:windowActionBarOverlay

 屬性的值為 

true

僅支援 Android 3.0 和以上

如果 minSdkVersion 為 

11

 或更高,自定義主題必須繼承 Theme.Holo 主題(或者它的子主題)。例如:

<resources>
    <!-- 為程式或者活動應用的主題樣式 -->
    <style name="CustomActionBarTheme"
           parent="@android:style/Theme.Holo">
        <item name="android:windowActionBarOverlay">true</item>
    </style>
</resources>
           

支援 Android 2.1 和更高

如果為了相容運作在 Android 3.0 以下版本的裝置而使用了 Support 庫,自定義主題必須繼承Theme.AppCompat 主題(或者它的子主題)。例如:

<resources>
    <!-- 為程式或者活動應用的主題樣式 -->
    <style name="CustomActionBarTheme"
           parent="@android:style/Theme.AppCompat">
        <item name="android:windowActionBarOverlay">true</item>

        <!-- 相容支援庫 -->
        <item name="windowActionBarOverlay">true</item>
    </style>
</resources>
           

請注意,這主題包含兩種不同的 

windowActionBarOverlay

 式樣定義:一個帶 

android:

 字首,另一個不帶。帶字首的适用于包含該式樣的 Android 系統版本,不帶字首的适用于通過從 Support 庫中讀取式樣的舊版本。

指定布局的頂部邊距

當 action bar 啟用疊加模式時,它可能會遮擋住本應保持可見狀态的布局。為了確定這些布局始終位于 action bar 下部,可以使用 actionBarSize 屬性來指定頂部margin或padding的高度來到達。例如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="?android:attr/actionBarSize">
    ...
</RelativeLayout>
           

如果在 action bar 中使用 Support 庫,需要移除 

android:

 字首。例如:

<!-- 相容支援庫 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="?attr/actionBarSize">
    ...
</RelativeLayout>
           

在這種情況下,不帶字首的 

?attr/actionBarSize

 适用于包括Android 3.0 和更高的所有版本。