• 第十四章:样式(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。

  • 相关阅读:
    linux 内核升级4.19
    监管对保险页面的要求
    软件测试-测试可交付成果
    软件测试架构思想
    dockerfile
    转载:.NET Core 图片操作在 Linux/Docker 下的坑
    docker build速度过慢问题
    .net 5 发布到 docker 或 docker 镜像方法
    Centos 安装 docker 教程
    DQL、DML、DDL、DCL全名是啥?
  • 原文地址:https://www.cnblogs.com/engine1984/p/4193719.html
Copyright © 2020-2023  润新知