正確使用 Android 的 Theme 和 Style
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 屬性。
相關文章
- Android中Style和Theme資源Android
- Android樣式(style)和主題(theme)Android
- Android中的Style、Theme詳解以及發展史Android
- Android中Handler的正確使用Android
- Android利用Theme和Style解決APP啟動閃黑屏問題AndroidAPP
- 看完後徹底搞清楚Android中的 Attr 、 Style 、ThemeAndroid
- 【QMUI教程】 Android Theme的使用UIAndroid
- Android-如何正確地使用HandlerAndroid
- 正確使用Android效能分析工具——TraceViewAndroidView
- Android 執行緒的正確使用姿勢Android執行緒
- 正確使用Github 的方法 + Git 和 GitHub 教程和技巧Github
- PHP Opcache 的正確使用PHPopcache
- GIT使用rebase和merge的正確姿勢Git
- 正確理解和使用JAVA中的字串常量池Java字串
- 關於正確使用Android AsyncTask學習整理Android
- 理解並正確使用synchronized和volatilesynchronized
- 正確使用Block避免Cycle Retain和CrashBloCAI
- Redis的正確使用姿勢Redis
- 使用正確的工具(轉載)
- 使用隨身碟和USB硬碟的正確方法(轉)硬碟
- 正確高效使用 GoogleGo
- 正確使用rman crosscheckROS
- 跨系統 theme 呼叫私有的 style v1
- android service,服務的正確姿勢Android
- java安全編碼指南之:lock和同步的正確使用Java
- 正確理解memcached,才能更好的使用
- laravel 使用 es 的正確姿勢Laravel
- ThreadLocal的正確使用與原理thread
- 使用快取的正確姿勢快取
- 十個正確使用 Redis 的技巧Redis
- Go通關04:正確使用 array、slice 和 map!Go
- KMB:正確使用媒體和資料調查
- 如何正確使用 Slim 框架框架
- Postman 正確使用姿勢Postman
- 正確使用Java事件通知Java事件
- 轉:正確使用rman crosscheckROS
- Android之android:theme設定在Application 和 Activity的區別AndroidAPP
- Android底部彈窗的正確開啟方式Android