zoukankan      html  css  js  c++  java
  • 第十四章:样式(Style)和主题(Theme)

    简介

    Android的样式(Style)和主题(Theme)文件就好比WEB开发中的CSS一样,可以实现UI界面的风格统一管理,这和Windows平台的XAML格式(Silverlight、WPF)类似。比如我们遇到特殊的节日我们只需变更我们的Style和Theme就可以切换一种新的Style和Theme。还有现有的一些应用提供我们可以自定义UI风格,就是应用的这个原理。Android的主题样式文件存储在resvalues目录下,如resvaluesstyles.xml。

    样式(Style)

    Style我们可以应用到单个组件或者一类组件,比如我们可以设置组件的字体、颜色等。

    下面的文件就是Android SDK(Version16)提供的一个Style文件片段(详细文件在:android-sdkplatformsandroid-16data esvaluesstyles.xml),如下所示我们可以看到系统的各个控件的默认的样式风格

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!-- Global Theme Styles -->
        <eat-comment />
        
        <style name="WindowTitleBackground">
            <item name="android:background">@android:drawable/title_bar</item>
        </style>
    
        <style name="WindowTitle">
            <item name="android:singleLine">true</item>
            <item name="android:textAppearance">@style/TextAppearance.WindowTitle</item>
            <item name="android:shadowColor">#BB000000</item>
            <item name="android:shadowRadius">2.75</item>
        </style>
         
        <style name="Widget.EditText">
            <item name="android:focusable">true</item>
            <item name="android:focusableInTouchMode">true</item>
            <item name="android:clickable">true</item>
            <item name="android:background">?android:attr/editTextBackground</item>
            <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
            <item name="android:textColor">?android:attr/editTextColor</item>
            <item name="android:gravity">center_vertical</item>
        </style>
        
        <style name="Widget.ExpandableListView" parent="Widget.ListView">
            <item name="android:groupIndicator">@android:drawable/expander_group</item>
            <item name="android:indicatorLeft">?android:attr/expandableListPreferredItemIndicatorLeft</item>
            <item name="android:indicatorRight">?android:attr/expandableListPreferredItemIndicatorRight</item>
            <item name="android:childDivider">@android:drawable/divider_horizontal_dark_opaque</item>
        </style>
        
        <style name="Widget.ImageButton">
            <item name="android:focusable">true</item>
            <item name="android:clickable">true</item>
            <item name="android:scaleType">center</item>
            <item name="android:background">@android:drawable/btn_default</item>
        </style>
       
        <style name="Widget.WebView">
            <item name="android:focusable">true</item>
            <item name="android:focusableInTouchMode">true</item>
            <item name="android:scrollbars">horizontal|vertical</item>
        </style>
    
        <style name="Widget.Gallery">
            <item name="android:fadingEdge">none</item>
            <item name="android:gravity">center_vertical</item>
            <item name="android:spacing">-20dip</item>
            <item name="android:unselectedAlpha">0.85</item>
        </style>
        
        <style name="Widget.PopupWindow">
            <item name="android:popupBackground">@android:drawable/editbox_dropdown_background_dark</item>
            <item name="android:popupAnimationStyle">@android:style/Animation.PopupWindow</item>
        </style>
    
        <!-- Default

    我们可以看到Style文件的跟元素像其他资源文件一样是:<resources> ,样式文件内部由多个的<style>节点构成,每一个style构成一个样式,样式还可以继承。如下所示,指定了样式名称已经其父样式的名称:

    <style name="Widget.ExpandableListView" parent="Widget.ListView">
    

    当然如果子样式定义的属性在父样式中存在,那么子样式将会覆盖父样式。

    比如我们可以定义如下的样式:

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
        <!-- 定义一个样式,指定字体大小、字体颜色 -->
        <style name="style1"> 
            <item name="android:textSize">20sp</item> 
            <item name="android:textColor">#00d</item> 
        </style>
        <!-- 定义一个样式,继承前一个颜色 -->
        <style name="style2" parent="@style/style1"> 
            <item name="android:background">#ee6</item>
            <item name="android:padding">8dp</item>
            <!-- 覆盖父样式中指定的属性 -->
            <item name="android:textColor">#000</item>
        </style>   
    </resources>

    我们可以在我们的layout文件中如下使用:[packagename.]style.file_name

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <!-- 指定使用style1的样式 -->
    <EditText  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/style1"
        style="@style/style1"
        />
    <!-- 指定使用style2的样式 -->
    <EditText  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/style2"
        style="@style/style2"
        />    
    </LinearLayout>
    

    主题(Theme)

    Theme一般用于整个应用或者一些特定的Activity。Theme一般用来设置应用的或者窗体的外观样式,比如应用背景,应用边框及标题等。

    下面的代码片段是Android SDK自带的默认主题(详细文件在:android-sdkplatformsandroid-16data esvalues hemes_device_defaults.xml):

    <?xml version="1.0" encoding="UTF-8"?>
        <style name="Theme.DeviceDefault" parent="Theme.Holo" >
            <!-- Text styles -->
            <item name="textAppearance">@android:style/TextAppearance.DeviceDefault</item>
            <item name="textAppearanceInverse">@android:style/TextAppearance.DeviceDefault.Inverse</item>
    
            <item name="textAppearanceLarge">@android:style/TextAppearance.DeviceDefault.Large</item>
            <item name="textAppearanceMedium">@android:style/TextAppearance.DeviceDefault.Medium</item>
            <item name="textAppearanceSmall">@android:style/TextAppearance.DeviceDefault.Small</item>
            <item name="textAppearanceLargeInverse">@android:style/TextAppearance.DeviceDefault.Large.Inverse</item>
            <item name="textAppearanceMediumInverse">@android:style/TextAppearance.DeviceDefault.Medium.Inverse</item>
            <item name="textAppearanceSmallInverse">@android:style/TextAppearance.DeviceDefault.Small.Inverse</item>
            <item name="textAppearanceSearchResultTitle">@android:style/TextAppearance.DeviceDefault.SearchResult.Title</item>
            <item name="textAppearanceSearchResultSubtitle">@android:style/TextAppearance.DeviceDefault.SearchResult.Subtitle</item>
    
            <item name="textAppearanceButton">@android:style/TextAppearance.DeviceDefault.Widget.Button</item>
    
            <item name="textAppearanceLargePopupMenu">@android:style/TextAppearance.DeviceDefault.Widget.PopupMenu.Large</item>
            <item name="textAppearanceSmallPopupMenu">@android:style/TextAppearance.DeviceDefault.Widget.PopupMenu.Small</item>
    
            <!-- Button styles -->
            <item name="buttonStyle">@android:style/Widget.DeviceDefault.Button</item>
    
            <item name="buttonStyleSmall">@android:style/Widget.DeviceDefault.Button.Small</item>
            <item name="buttonStyleInset">@android:style/Widget.DeviceDefault.Button.Inset</item>
    
            <item name="buttonStyleToggle">@android:style/Widget.DeviceDefault.Button.Toggle</item>
            <item name="switchStyle">@android:style/Widget.DeviceDefault.CompoundButton.Switch</item>
    
            <item name="borderlessButtonStyle">@android:style/Widget.DeviceDefault.Button.Borderless</item>
    
            <item name="listSeparatorTextViewStyle">@android:style/Widget.DeviceDefault.TextView.ListSeparator</item>
    
            <!-- Window attributes -->
            <item name="windowTitleStyle">@android:style/WindowTitle.DeviceDefault</item>
            <item name="windowTitleBackgroundStyle">@android:style/WindowTitleBackground.DeviceDefault</item>
            <item name="android:windowAnimationStyle">@android:style/Animation.DeviceDefault.Activity</item>
    
            <!-- Dialog attributes -->
            <item name="alertDialogStyle">@android:style/AlertDialog.DeviceDefault</item>
            <item name="dialogTheme">@android:style/Theme.DeviceDefault.Dialog</item>
            <item name="alertDialogTheme">@android:style/Theme.DeviceDefault.Dialog.Alert</item></style>
        

    主题和样式的定义方式类似:通过Style来指定并且也支持继承。我们自定义一个主题如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
        <style name="CustomrTheme">
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowFullscreen">true</item>        
            <item name="android:windowFrame">@drawable/window_border</item>
            <item name="android:windowBackground">@drawable/star</item>
        </style>    
    </resources>

    我们可以在代码中来设置一个Activity的主题,如下粗体代码行。

    public class MainActivity extends Activity
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            setTheme(R.style.CustomerTheme)
        }
    }

    我们通过应用的的配置文件(AndroidManifest.xml)中来指定主题,而不是通过代码行来指定。

    如果要指定一个主题应用与整个App,我们可以设置Application节点的android:theme属性:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.jeriffe.app"android:versionCode="1" android:versionName="1.0">
        <application android:icon="@drawable/icon"
             android:label="@string/app_name"
            android:theme="@style/CustomerTheme">
            <activity android:name=".XXXXX">
            </activity>
        </application>
    </manifest> 

    如果我们想指定主题应用与具体的Activity我们只需要设置activity的android:theme属性:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.jeriffe.app"  android:versionCode="1"android:versionName="1.0">
        <application android:icon="@drawable/icon"
             android:label="@string/app_name">
            <activity android:name=".XXXX"
                      android:theme="@style/CustomerTheme">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest> 

    结束语

    我们简单的介绍了Style和Theme,如果您有WEB开发或者WPhone或者WPF开发经验,那么您会很好的理解Style和Theme。

  • 相关阅读:
    《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜
    《Machine Learning in Action》—— 女同学问Taoye,KNN应该怎么玩才能通关
    《Machine Learning in Action》—— Taoye给你讲讲决策树到底是支什么“鬼”
    深度学习炼丹术 —— Taoye不讲码德,又水文了,居然写感知器这么简单的内容
    《Machine Learning in Action》—— 浅谈线性回归的那些事
    《Machine Learning in Action》—— 懂的都懂,不懂的也能懂。非线性支持向量机
    《Machine Learning in Action》—— hao朋友,快来玩啊,决策树呦
    《Machine Learning in Action》—— 剖析支持向量机,优化SMO
    《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM
    JVM 字节码指令
  • 原文地址:https://www.cnblogs.com/engine1984/p/4193719.html
Copyright © 2011-2022 走看看