Android Theme的使用


原文地址 http://www.cnblogs.com/Dentist/p/4369816.html

Theme是一套UI控件和Activity的樣式。可以給Application 和 activity 設置主題。來設置顯示界面的樣式。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jude.test.education" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        <!--這里設置的是整個APP的主題,所有activiy和view都會默認為這個主題-->
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            <!--這里設置的是這個Activity的主題,Activity所有view都會默認為這個主題-->
            android:theme="@style/AppTheme"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

在value->style里定義主題。可以繼承並重寫屬性。

    <!-- 兼容主題 深色主題 activity背景默認黑色,字體默認白色-->
    <style name="AppTheme" parent="Theme.AppCompat">
    </style>

    <!-- 兼容主題 淺色主題 activity背景默認白色 字體默認黑色 -->
    <style name="AppTheme2" parent="Theme.AppCompat.Light">
    </style>

    <!-- 兼容主題 深色主題 無Actionbar-->
    <style name="AppTheme3" parent="Theme.AppCompat.NoActionBar">
    </style>

    <!-- 兼容主題 淺色主題 無Actionbar-->
    <style name="AppTheme4" parent="Theme.AppCompat.Light.NoActionBar">
    </style>

如果使用 android.support.v7.app.ActionBarActivity 就必須要用兼容主題Theme.AppCompat。

ActionBarActivity 的存在就是為了兼容低API。讓他們用上高API的東西。比如Toolbar。

 

如果使用普通的Activity就可以用Holo主題。

Holo主題是Android4.0開始谷歌極力推行的Android Design的主題。

    <style name="AppTheme5" parent="android:Theme.Holo">
    </style>

不過Android5.0谷歌又推出了Material Design來取代Android Design。

如果你的APP從5.0起配的話就可以直接使用Material主題

    <style name="AppTheme5" parent="android:Theme.Material">
    </style>

 

在代碼中設置Activity的主題

setTheme(R.style.Theme_AppCompat);

Activity 是 ContextThemeWrapper的子類。而ContextThemeWrapper一個很重要的 屬性就是Theme。

實例化一個View必須要 new View(Context context) 。因為View需要把Attributes交給Context的Theme來確定一堆屬性(在一個叫TypedArray的容器里)。

比如當你沒有定義TextView的字體顏色時,他該顯示什么顏色。他要去問Theme。

下面是Theme的官方解釋加上我險過四級的英語水平。

/**
     * This class holds the current attribute values for a particular theme.
    這個類持有特定主題的當前attribute
     * In other words, a Theme is a set of values for resource attributes;
    換句話說是資源attribute屬性的集合
     * these are used in conjunction with {@link TypedArray}
    這些屬性和TypedArray結合使用
     * to resolve the final value for an attribute.
    來得出attribute的最終值
     * 
     * <p>The Theme's attributes come into play in two ways: (1) a styled
    這個主題的屬性通過兩種方式執行:
     * attribute can explicit reference a value in the theme through the
    (1)一個設置過的attribute可以通過"?themeAttribute"語法明確引用一個值
   * "?themeAttribute" syntax; (2) if no value has been defined for a
    (2)如果在一個特定的 attribute 有一個沒有被定義的值,在最后我們會嘗試
     * particular styled attribute, as a last resort we will try to find that
    在主題中找到他那個值
     * attribute's value in the Theme.
     * 
     * <p>You will normally use the {@link #obtainStyledAttributes} APIs to
     * retrieve XML attributes with style and theme information applied.
     */
    public final class Theme {
    /*
     *太長不寫
     */
    }

  

常用的theme項:

    <style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!--主色-->
        <item name="colorPrimary">@color/theme_primary</item>
        <!--深色主色-->
        <item name="colorPrimaryDark">@color/theme_primary</item>
        <!--醒目主色-->
        <item name="colorAccent">@color/theme_accent</item>
        <!--抽屜開關樣式-->
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    </style>

    <style name="AppTheme" parent="BaseTheme">
        <!--窗體透明-->
        <item name="android:windowIsTranslucent">true</item>
        <!--窗體背景-->
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

    <style name="LaunchTheme" parent="Theme.AppCompat.NoActionBar">
        <!--窗體背景,這個背景能在第一時間顯示,可以用作啟動界面,但此windows不可再使用view-->
        <item name="android:background">@drawable/bg_launch</item>
    </style>

    <style name="MainTheme" parent="BaseTheme">
        <!--窗體動畫-->
        <item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
    </style>

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <!--抽屜開關箭頭顏色-->
        <item name="color">@android:color/white</item>
    </style>

 所有theme項:

     <item name="windowActionBar">true</item>
        <item name="windowActionBarOverlay">false</item>

        <!-- Used by MediaRouter -->
        <item name="isLightTheme">false</item>

        <item name="selectableItemBackground">@drawable/abc_item_background_holo_dark</item>
        <item name="selectableItemBackgroundBorderless">?attr/selectableItemBackground</item>
        <item name="homeAsUpIndicator">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>

        <item name="dividerVertical">@drawable/abc_list_divider_mtrl_alpha</item>
        <item name="dividerHorizontal">@drawable/abc_list_divider_mtrl_alpha</item>

        <!-- Action Bar Styles -->
        <item name="actionBarTabStyle">@style/Widget.AppCompat.ActionBar.TabView</item>
        <item name="actionBarTabBarStyle">@style/Widget.AppCompat.ActionBar.TabBar</item>
        <item name="actionBarTabTextStyle">@style/Widget.AppCompat.ActionBar.TabText</item>
        <item name="actionButtonStyle">@style/Widget.AppCompat.ActionButton</item>
        <item name="actionOverflowButtonStyle">@style/Widget.AppCompat.ActionButton.Overflow</item>
        <item name="actionOverflowMenuStyle">@style/Widget.AppCompat.PopupMenu.Overflow</item>
        <item name="actionBarStyle">@style/Widget.AppCompat.ActionBar.Solid</item>
        <item name="actionBarSplitStyle">?attr/actionBarStyle</item>
        <item name="actionBarWidgetTheme">@null</item>
        <item name="actionBarTheme">@style/ThemeOverlay.AppCompat.ActionBar</item>
        <item name="actionBarSize">@dimen/abc_action_bar_default_height_material</item>
        <item name="actionBarDivider">?attr/dividerVertical</item>
        <item name="actionBarItemBackground">?attr/selectableItemBackgroundBorderless</item>
        <item name="actionMenuTextAppearance">@style/TextAppearance.AppCompat.Widget.ActionBar.Menu</item>
        <item name="actionMenuTextColor">?android:attr/textColorPrimaryDisableOnly</item>

        <!-- Dropdown Spinner Attributes -->
        <item name="actionDropDownStyle">@style/Widget.AppCompat.Spinner.DropDown.ActionBar</item>

        <!-- Action Mode -->
        <item name="actionModeStyle">@style/Widget.AppCompat.ActionMode</item>
        <item name="actionModeBackground">@drawable/abc_cab_background_top_material</item>
        <item name="actionModeSplitBackground">?attr/colorPrimaryDark</item>
        <item name="actionModeCloseDrawable">@drawable/abc_ic_ab_back_mtrl_am_alpha</item>
        <item name="actionModeCloseButtonStyle">@style/Widget.AppCompat.ActionButton.CloseMode</item>

        <item name="actionModeCutDrawable">@drawable/abc_ic_menu_cut_mtrl_alpha</item>
        <item name="actionModeCopyDrawable">@drawable/abc_ic_menu_copy_mtrl_am_alpha</item>
        <item name="actionModePasteDrawable">@drawable/abc_ic_menu_paste_mtrl_am_alpha</item>
        <item name="actionModeSelectAllDrawable">@drawable/abc_ic_menu_selectall_mtrl_alpha</item>
        <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_mtrl_alpha</item>

        <!-- Panel attributes -->
        <item name="panelMenuListWidth">@dimen/abc_panel_menu_list_width</item>
        <item name="panelMenuListTheme">@style/Theme.AppCompat.CompactMenu</item>
        <item name="panelBackground">@drawable/abc_menu_hardkey_panel_mtrl_mult</item>
        <item name="android:panelBackground">@android:color/transparent</item>
        <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item>

        <!-- List attributes -->
        <item name="textAppearanceListItem">@style/TextAppearance.AppCompat.Subhead</item>
        <item name="textAppearanceListItemSmall">@style/TextAppearance.AppCompat.Subhead</item>
        <item name="listPreferredItemHeight">64dp</item>
        <item name="listPreferredItemHeightSmall">48dp</item>
        <item name="listPreferredItemHeightLarge">80dp</item>
        <item name="listPreferredItemPaddingLeft">16dip</item>
        <item name="listPreferredItemPaddingRight">16dip</item>

        <!-- Required for use of support_simple_spinner_dropdown_item.xml -->
        <item name="spinnerDropDownItemStyle">@style/Widget.AppCompat.DropDownItem.Spinner</item>
        <item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>

        <!-- Popup Menu styles -->
        <item name="popupMenuStyle">@style/Widget.AppCompat.PopupMenu</item>
        <item name="textAppearanceLargePopupMenu">@style/TextAppearance.AppCompat.Widget.PopupMenu.Large</item>
        <item name="textAppearanceSmallPopupMenu">@style/TextAppearance.AppCompat.Widget.PopupMenu.Small</item>
        <item name="listPopupWindowStyle">@style/Widget.AppCompat.ListPopupWindow</item>
        <item name="dropDownListViewStyle">@style/Widget.AppCompat.ListView.DropDown</item>

        <!-- SearchView attributes -->
        <item name="searchViewStyle">@style/Widget.AppCompat.SearchView</item>
        <item name="android:dropDownItemStyle">@style/Widget.AppCompat.DropDownItem.Spinner</item>
        <item name="textColorSearchUrl">@color/abc_search_url_text</item>
        <item name="textAppearanceSearchResultTitle">@style/TextAppearance.AppCompat.SearchResult.Title</item>
        <item name="textAppearanceSearchResultSubtitle">@style/TextAppearance.AppCompat.SearchResult.Subtitle</item>

        <!-- ShareActionProvider attributes -->
        <item name="activityChooserViewStyle">@style/Widget.AppCompat.ActivityChooserView</item>

        <!-- Toolbar styles -->
        <item name="toolbarStyle">@style/Widget.AppCompat.Toolbar</item>
        <item name="toolbarNavigationButtonStyle">@style/Widget.AppCompat.Toolbar.Button.Navigation</item>

        <item name="android:editTextStyle">@style/Widget.AppCompat.EditText</item>
        <item name="editTextBackground">@drawable/abc_edit_text_material</item>
        <item name="editTextColor">?android:attr/textColorPrimary</item>
        <item name="android:autoCompleteTextViewStyle">@style/Widget.AppCompat.AutoCompleteTextView</item>

        <!-- Color palette -->
        <item name="colorPrimaryDark">@color/primary_dark_material_dark</item>
        <item name="colorPrimary">@color/primary_material_dark</item>
        <item name="colorAccent">@color/accent_material_dark</item>

        <item name="colorControlNormal">?android:attr/textColorSecondary</item>
        <item name="colorControlActivated">?attr/colorAccent</item>
        <item name="colorControlHighlight">@color/ripple_material_dark</item>
        <item name="colorButtonNormal">@color/button_material_dark</item>
        <item name="colorSwitchThumbNormal">@color/switch_thumb_normal_material_dark</item>

        <item name="drawerArrowStyle">@style/Widget.AppCompat.DrawerArrowToggle</item>

        <item name="switchStyle">@style/Widget.AppCompat.CompoundButton.Switch</item>

        <item name="android:ratingBarStyle">@style/Widget.AppCompat.RatingBar</item>

        <!-- Button styles -->
        <item name="android:buttonStyle">@style/Widget.AppCompat.Button</item>
        <item name="android:buttonStyleSmall">@style/Widget.AppCompat.Button.Small</item>
        <item name="android:textAppearanceButton">@style/TextAppearance.AppCompat.Button</item>

 繼承一個Theme。重載上面的屬性可以更方便的控制整個APP的風格。

 

下面說說style。

theme是全局的設計風格。style是局部的設計風格。

看我另一篇介紹ToolBar的帖子。里面說到了。系統是Light主題。而ToolBar需要Dark主題。可以給ToolBar單獨設置一個 

app:theme="@style/Theme.AppCompat"

而只有toolbar是特例。其他view並不能使用這個。
所以谷歌推出了 ThemeOverlay 來解決這個問題。詳情自行翻牆:https://chris.banes.me/2014/11/12/theme-vs-style/
<LinearLayout
    android:theme="@android:style/ThemeOverlay.Material.Dark">
    
    <!-- Anything here will also have a dark theme -->
    
</LinearLayout>

這樣就可以給View設置單獨主題了。

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM