Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> 正確使用 Android 的 Theme 和 Style

正確使用 Android 的 Theme 和 Style

編輯:Android資訊

Android 5.0 可以給一個 View 單獨設置一個 theme 了,其主要用途就是用在 ToolBar 上, 比如 當前使用白色主題但是想使用黑色的 ToolBar ,只要在 ToolBar 的 xml 文件 中添加 android:theme=”@android:style/ThemeOverlay.Material.Dark.ActionBar” 即可。

<Toolbar  
    android:layout_height="?android:attr/actionBarSize"
    android:layout_width="match_parent"
    android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar" />

該功能在 5.0 之前也存在,只是無法單獨在 View 上設置而已,比如 5.0之前的 Theme.Holo.Light.DarkActionBar 主題,就是白色主題但是 ActionBar 是黑色。這種底層實現方式是通過一個 actionBarWidgetTheme 來引入一個新的主題。

<style name="Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarWidgetTheme">@android:style/Theme.Holo</item>
</style>

底層實現細節

底層是通過 ContextThemeWrapper 類實現的,顧名思義該類所做的工作就是在當前 context 上裝飾另外一個 theme,來覆蓋(改變)一些控件的屬性。

因此,在 5.0 中又引入了一種新的 theme – ThemeOverlay ,主要有這麼兩種:

  • ThemeOverlay.Material.Light
  • ThemeOverlay.Material.Dark

分別為 白色 和黑色的。把這兩個 theme 裝飾到 Theme.Material 上來修改部分的樣式為白色或者黑色。同樣,對於特殊的 ActionBar 而言,也有兩個衍生出來的 ThemeOverlay theme:

  • ThemeOverlay.Material.Light.ActionBar
  • ThemeOverlay.Material.Dark.ActionBar

這兩個 theme 應該只使用在 5.0 的新 屬性actionBarTheme 或者 Toolbar 上(上面的 xml 代碼示例)。 這兩個 theme 目前只是把  colorControlNormal 修改為android:textColorPrimary 的值並把所有的文字和圖標都設置為不透明的。

android:theme

android:theme 是 5.0 中新添加到 View 上的屬性。需要注意的是, 該屬性會傳遞給所有子控件,例如:

<LinearLayout
    android:theme="@android:style/ThemeOverlay.Material.Dark">

    <!--這裡面的所有 view 都會使用 ThemeOverlay.Material.Dark theme,除非你在單獨給某個 view 設置一個新的 theme 屬性  -->

</LinearLayout>

5.0 還引入了一個新的 theme 屬性: colorEdgeEffect ,該屬性可以定制一個 View 過度滑動的(顏色)效果, 通過上面的 方式可以很容易的修改一個 View 的 過度滑動效果;

由於這是一個 theme 裡面的 屬性,所以無法直接應用到 View 上,我們可以自定義一個 Overlay theme, 在裡面設置 colorEdgeEffect 的值,然後在 View 上通過 android:theme 屬性來設置這個自定義的 theme 即可。

自定義theme res/values/themes.xml

<style name=”RedThemeOverlay” parent=”android:ThemeOverlay.Material”>
<item name=”android:colorEdgeEffect”>#FF0000</item>
</style>

然後把該 theme 設置到 view 上:

<ListView … android:theme=”RedThemeOverlay” />

通過上面同樣的方式,您可以自定義所有 theme 裡面的屬性。

Theme VS Style

那麼問題來了, Theme 和 Style 到底有啥區別呢? 他們的定義方式是一模一樣的,只是使用的地方不一樣而已。

Theme 是用來設置應用全局 主題風格的, 5.0 上可以讓你局部的調整設計風格;

而 Style 主要是用在 View 上的,當你在 view 上設置 style 的時候,LayoutInflater  會讀取 該 style 的內容並在任意單獨設置的樣式之前把該內容設置到 AttributeSet 中。

總結起來就是: Theme 是全局的;Style 是局部的。

需要注意的是,如果您使用 AppCompat V21 的話,當前 AppCompat 只能在android.support.v7.widget.Toolbar 上使用 Theme 屬性。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved