• 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 来解决这个问题。详情自行FQ: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设置单独主题了。

     


  • 相关阅读:
    Java中测试对象的等价性
    Python文件方法
    Python在windows下的安装与配置
    ubuntu日志清理
    hiho48 : 欧拉路·一
    ADO.NET异步操作测试
    c# 生成二维码
    PowerCmd 2.2 注册码
    IE跨Iframe时Session丢失问题
    MongoDB3.0 创建用户
  • 原文地址:https://www.cnblogs.com/Jude95/p/4369816.html
Copyright © 2020-2023  润新知