`
gogoalong
  • 浏览: 49674 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

[Android基础]theme、style、attr之间联系与区别

阅读更多

Android上的Style分为了两个方面:

1,Theme是针对窗体级别的,改变窗体样式;
2,Style是针对窗体元素级别的,改变指定控件或者Layout的样式。

Android系统的themes.xml和style.xml以及attrs.xml(位于系统源代码frameworks\base\core\res\res\values\)包含了很多系统定义好的style,建议在里面挑个合适的,然后再继承修改。

  • 风格是一个包含一种或者多种格式化属性的集合,你可以将其用为一个单位用在布局XML单个元素当中。比如,你可以定义一种风格来定义文本的字号大小和颜色,然后将其用在View元素的一个特定的实例。
  • 主题是一个包含一种或者多种格式化属性的集合,你可以将其为一个单位用在应用中所有的Activity当中或者应用中的某个Activity当 中。比如,你可以定义一个主题,它为window frame和panel 的前景和背景定义了一组颜色,并为菜单定义可文字的大小和颜色属性,你可以将这个主题应用在你程序当中所有的Activity里。

-----------------------------------------------------------------------------------

一,Theme主题:

应用于Application、Activity,主题Theme就是用来设置界面UI风格,可以设置整个应用或者某个活动Activity的界面风格。在Android SDK中内置了下面的Theme,可以按标题栏Title Bar和状态栏Status Bar是否可见来分类:
1.1.系统自带主题
<span style="font-family:Times New Roman;font-size:14px;">android:theme="@android:style/Theme.Dialog" : Activity显示为对话框模式
android:theme="@android:style/Theme.NoTitleBar" : 不显示应用程序标题栏
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" : 不显示应用程序标题栏,并全屏
android:theme="@android:style/Theme.Light ": 背景为白色
android:theme="@android:style/Theme.Light.NoTitleBar" : 白色背景并无标题栏
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" : 白色背景,无标题栏,全屏
android:theme="@android:style/Theme.Black" : 背景黑色
android:theme="@android:style/Theme.Black.NoTitleBar" : 黑色背景并无标题栏
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" : 黑色背景,无标题栏,全屏.全屏将会没有
android:theme="@android:style/Theme.Wallpaper" : 用系统桌面为应用程序背景
android:theme="@android:style/Theme.Wallpaper.NoTitleBar" : 用系统桌面为应用程序背景,且无标题栏
android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen" : 用系统桌面为应用程序背景,无标题栏,全屏
android:theme="@android:style/Theme.Translucent : 透明背景
android:theme="@android:style/Theme.Translucent.NoTitleBar" : 透明背景并无标题
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" : 透明背景并无标题,全屏
android:theme="@android:style/Theme.Panel ": 面板风格显示
android:theme="@android:style/Theme.Light.Panel" : 平板风格显示</span>

跟踪其中Theme.Black的源码,可以看到如下

<span style="font-family:Times New Roman;font-size:14px;">  <!-- Variant on {@link #Theme} that ensures the background is
         completely black.  This is useful for things like image viewers and
         media players.   If you want the normal (dark background) theme
         do <em>not</em> use this, use {@link #Theme}. -->
    <style name="Theme.Black">
        <item name="android:windowBackground">@android:color/black</item>
        <item name="android:colorBackground">@android:color/black</item>
    </style></span>
该配置文件定义了背景色为黑色

1.2.使用Theme的方式
1.2.1,在XML中添加:
<span style="font-family:Times New Roman;font-size:14px;"><application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Light.NoTitleBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application></span>

1.2.2,通过代码添加
在Activity中的onCreate()方法中设置,注意,setTheme()方法要放在setContentView()之前调用,否则没有效果。
<span style="font-family:Times New Roman;font-size:14px;">    @Override
    public void onCreate(Bundle savedInstanceState){
	super.onCreate(savedInstanceState);
	setTheme(android.R.style.Theme_Translucent_NoTitleBar);
	setContentView(R.layout.main);
    }</span>

1.3,自定义主题

根据需要,我们可能需要自己定义满足我们需求的主题。

<span style="font-family:Times New Roman;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<resources>
 <style name="CustomTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="windowFrame">@drawable/screen_frame</item>
    <item name="windowBackground">@drawable/screen_background_white</item>
    <item name="panelTextSize">14sp</item>
 </style>
</resources></span>
1.3.2 Theme继承
Android系统提供了需要定义好的主题资源,我们在定义使用themes时,可以继承使用系统主题资源
<span style="font-family:Times New Roman;font-size:14px;">    <style name="Sample" parent="@android:style/Theme.Black">
        <item name="android:colorBackground">@android:color/holo_orange_dark</item>
    </style></span>
在继承使用自己定义的主题资源时,不需要使用parent指定资源,可以使用如下继承方式
<span style="font-family:Times New Roman;font-size:14px;">    <style name="Sample.NoTitleBar">
        <item name="android:windowNoTitle">true</item>
    </style></span>

二,style风格:

应用于组件View。经常在代码开发中会重复去设置很多View的布局参数,然而很多组件是拥有相同的配置参数,如

上图中手机备份、闪电互传等就具有很多相同的配置参数,可以设置为一组Style。

风格是一个包含一种或者多种格式化属性的集合,你可以将其用为一个单位用在布局XML单个元素当中。比如,你可以定义一种风格来定义文本的字号大小和颜色,然后将其用在View元素的一个特定的实例。

2.1 基本用法

Android采用XML实现界面布局,Android中的Style类似CSS,是能够真正做到网页表现与内容分离,View配置中也提供了html中如id、name属性一样的功能标签。

<span style="font-family:Times New Roman;font-size:14px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test1"
        android:textColor="#FFFFFFFF"
        android:textSize="16sp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test2"
        android:textColor="#FFFFFFFF"  
        android:textSize="16sp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test3"
        android:textColor="#FFFFFFFF" 
        android:textSize="16sp" />

</LinearLayout>
  </span>

在上面的布局文件中,三个TextView的android:layout_width、android:layout_height、android:textColor、android:textSize样式属性都一样,这种情况下我们就可以单独定义一个style,以一种更优雅的做法来代替上面的写法。

tmp_style.xml

<span style="font-family:Times New Roman;font-size:14px;"><resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="TextStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">#FFFFFFFF</item>
        <item name="android:textSize">16sp</item>
    </style>
</resources> 
</span>

注:style文件必须放在values-*目录中

接下来就是在View配置中使用style了

<span style="font-family:Times New Roman;font-size:14px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv1"
        style="@style/TextStyle"
        android:text="test1" />

    <TextView
        android:id="@+id/tv2"
        style="@style/TextStyle"
        android:text="test2" />

    <TextView
        android:id="@+id/tv3"
        style="@style/TextStyle"
        android:text="test4" />

</LinearLayout></span>
使用时只需要使用style属性引用我们定义好的style即可,这种方式可以定义避免重复性的工作,简化工作。

2.2 Styles继承

Android系统为我们提供了一整套的style,比如说显示字符串最基本的style是TextAppearance,他定义的一些最基本的属性

<span style="font-family:Times New Roman;font-size:14px;">    <style name="TextAppearance">
        <item name="textColor">?textColorPrimary</item>
        <item name="textColorHighlight">?textColorHighlight</item>
        <item name="textColorHint">?textColorHint</item>
        <item name="textColorLink">?textColorLink</item>
        <item name="textSize">16sp</item>
        <item name="textStyle">normal</item>
    </style></span>

还有许多各方面的style,大家可以参见:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/styles.xml

如果只想改变TextAppearance中的某一项属性时,这时可以使用继承来实现

<span style="font-family:Times New Roman;font-size:14px;">    <style name="Sample_1" parent="@android:style/TextAppearance">
        <item name="android:textColor">#909090</item>
    </style></span>

也可以继承自己定义的style,继承自己定义的style时,不需要使用parent属性来指定

<span style="font-family:Times New Roman;font-size:14px;">    <style name="Sample_1.Small">
        <item name="android:textSize">12sp</item>
    </style></span>

三,Attrs属性:

attrs看字面意思就是一组属性的集合,那attrs有什么用呢,在自定义View的时候,一般会自定义一些属性,通过构造方法中AttributeSet参数的封装,让我们能够获取到为View配置的属性,至于怎么操作,大家可以参看http://developer.android.com/training/custom-views/index.html上介绍的这个例子


四,Attrs、Style、Theme之间的联系

第一我们定义一个attrs,并指定好类型

<span style="font-family:Times New Roman;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="gdDrawableWidth" format="dimension" />
    <attr name="gdDrawableHeight" format="dimension" />
    <attr name="gdActionBarTitleColor" format="color" />
    <attr name="gdActionBarBackground" format="reference" />

</resources></span>

然后就可以在style中进行引用了

<span style="font-family:Times New Roman;font-size:14px;"><resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="TextStyle">
        <item name="android:layout_width">?attr/gdDrawableWidth</item>
        <item name="android:layout_height">?attr/gdDrawableHeight</item>
        <item name="android:textColor">?attr/gdActionBarTitleColor</item>
        <item name="android:textSize">16sp</item>
    </style>

</resources></span>

每一个引用需要指向一个实际资源,这里可以在themes 中定义

<span style="font-family:Times New Roman;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Light">

        <item name="gdDrawableWidth">@dimen/gd_drawable_width</item>
        <item name="gdDrawableHeight">@dimen/gd_drawable_height</item>
        <item name="gdActionBarTitleColor">@color/gd_bar_title_color</item>
        <item name="gdActionBarBackground">@color/gd_bar_backgroud</item>
    
    </style>

</resources></span>
<span style="font-family:Times New Roman;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<resources>

    <color name="gd_bar_title_color">#FFFFFFFF</color>
    <color name="gd_bar_backgroud">#FF777777</color>

</resources></span>
<span style="font-family:Times New Roman;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<resources>

    <dimen name="gd_drawable_width">200dp</dimen>
    <dimen name="gd_drawable_height">40dp</dimen>

</resources></span>

列表如下:



https://github.com/cyrilmottier/GreenDroid

http://developer.android.com/guide/topics/ui/themes.html

http://developer.android.com/training/custom-views/index.html

分享到:
评论

相关推荐

    Android自定义Attr属性

    在实际开发中,还可以结合Style、Theme等机制,进一步提高代码的可配置性和一致性。 此外,自定义Attr也可以用于实现更复杂的特性,例如动画效果、字体样式等。通过定义多个Attr,你可以创建一个完整的属性集,用于...

    Android Style实例总结

    首先,我们需要理解Android Style的基础。在Android中,样式通常定义在`res/values/styles.xml`文件中,它们是XML资源,由一个或多个属性组成,这些属性会影响组件的视觉表现和行为。样式可以继承自其他样式,这样就...

    Style&Attr;详解

    在Android开发中,Style和Attr是两种用于定义和应用UI元素样式的资源。Style是一组可以被引用的属性集合,可以定义特定的UI外观和行为;而Attr则是XML标签的属性,用来定义控件在XML布局文件中应该如何表现。了解...

    Androidtheme简单使用示例.zip

    android:theme="@style/AppTheme"&gt; &lt;!-- 应用主题 --&gt; ... ``` 这里,`@style/AppTheme`引用了我们在`styles.xml`中定义的主题。 除了全局应用主题,还可以为特定的Activity或者Fragment设置主题。在对应的类...

    安卓Android源码——theme1.rar

    【Android 源码分析:深入理解 Theme1】 在 Android 开发中,主题(Theme)是一种重要的设计元素,它能够统一应用的视觉风格,并在整个应用中一致地应用这些样式。当我们谈论“Android 源码——Theme1.rar”时,这...

    Android 中自定义属性(attr.xml,TypedArray)的使用

    在Android开发中,自定义属性(attr.xml, TypedArray)是一种强大的工具,它允许开发者扩展Android组件的功能,创建个性化的UI元素,同时提高代码的可重用性和可配置性。以下将详细介绍如何在Android中使用自定义...

    Android style简单学习应用示例.zip

    "Android style简单学习应用示例.zip"提供了一个基础的源码示例,帮助初学者理解如何在Android应用中使用和自定义风格。 首先,让我们了解什么是Android Style。在Android中,风格是XML文件中的一组属性,定义了UI...

    Android代码-一个对安卓应用支持多种主题的库

    利用Android自身支持的不同Style中可复写相同的attribute的值的特性,通过代码动态设置不同的Style来达到不同主题的切换效果。它支持静态设置控件使用主题元素的方式——layout的xml中定义控件时使用,也支持程序...

    Android style简单学习应用示例.zip源码资源下载

    在Android开发中,风格(style)是至关重要的一个部分,它可以帮助开发者统一应用程序的外观和交互体验,提高代码的可维护性和复用性。本示例是一个关于Android风格设计的简单学习应用,通过分析和实践这个项目,...

    Android-Android自定义TitleBar

    android:theme="@style/AppTheme.CustomTitleBar" /&gt; ``` 通过以上步骤,你可以实现一个完全符合应用需求的自定义TitleBar。记住,好的TitleBar设计不仅美观,还应该提供清晰的操作指引,增强用户的交互体验。在...

    Android自定义toolbar布局

    android:theme="@style/Theme.AppCompat.Light.NoActionBar" /&gt; ``` 总结来说,自定义`Toolbar`布局在Android开发中是一项重要的任务,它允许我们创建独特且符合设计规范的用户界面。通过添加自定义视图、设置标题...

    android主题设置demo

    android:theme="@style/AppTheme.NoActionBar"&gt; ... ``` 这里,整个应用使用`AppTheme`,而`MainActivity`则使用了没有动作栏的`AppTheme.NoActionBar`。 为了实现"android主题设置demo",开发者通常会创建一个...

    android TitleBar

    android:theme="@style/AppTheme.AppBarOverlay"&gt; &lt;com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/...

    Android窗体自定义标题栏

    - 通过设置`android:paddingTop`和`android:paddingBottom`来调整内容区域与标题栏之间的间距。 - `android:theme`属性可以改变标题栏的整体风格,例如设置字体颜色、背景色等。 - 使用`AppCompatActivity`和`...

    DrawerLayout + Toolbar 与主题theme 颜色设置

    android:theme="@style/AppTheme"&gt; ``` 此外,还可以使用`toolbar_theme.xml`这样的样式文件来单独为`Toolbar`设置颜色,然后在布局文件中引用: ```xml &lt;!-- toolbar_theme.xml --&gt; &lt;style name="ToolbarTheme...

    Android应用程序替换背景

    这个主题,"Android应用程序替换背景",涉及到的核心技术是使用`attr`资源,这是一种在XML中定义自定义属性的方法,它使得我们可以更加灵活地控制应用的样式和外观。 首先,我们来理解什么是`attr`。在Android中,`...

    Android底部tab栏与标题栏结合

    android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:titleTextColor="@android:color/white" /&gt; ``` 然后在Activity中: ```java Toolbar toolbar = findViewById(R.id.toolbar); ...

    Android-TitleBar自定义标题居中的ToolBar

    android:theme="@style/ThemeOverlay.AppCompat.ActionBar" /&gt; ``` 接着,我们可以在Activity的Java或Kotlin代码中设置ToolBar为Activity的Action Bar: ```java Toolbar toolbar = findViewById(R.id.toolbar); ...

Global site tag (gtag.js) - Google Analytics