• 正确使用 Android 的 Theme 和 Style


    原文:http://www.tuicool.com/articles/ZjEZFj

    Android 5.0 可以给一个 View 单独设置一个 theme 了,其主要用途就是用在 ToolBar 上, 比如 当前使用白色主题但是想使用黑色的 ToolBar ,

    只要在 ToolBar 的 xml 文件 中添加 android:theme=”@android:style/ThemeOverlay.Material.Dark.ActionBar” 即可。

    <Toolbar  
        android:layout_height="?android:attr/actionBarSize"
        android:layout_width="match_parent"
        android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar" />

    该功能在 5.0 之前也存在,只是无法单独在 View 上设置而已,比如 5.0之前的 Theme.Holo.Light.DarkActionBar 主题,就是白色主题但是 ActionBar 是黑色。这种底层实现方式是通过一个 actionBarWidgetTheme 来引入一个新的主题。

    <style name="Theme.Holo.Light.DarkActionBar">
        <item name="android:actionBarWidgetTheme">@android:style/Theme.Holo</item>
    </style>

    底层实现细节

    底层是通过 ContextThemeWrapper 类实现的,顾名思义该类所做的工作就是在当前 context 上装饰另外一个 theme,来覆盖(改变)一些控件的属性。

    因此,在 5.0 中又引入了一种新的 theme – ThemeOverlay ,主要有这么两种:

    • ThemeOverlay.Material.Light
    • ThemeOverlay.Material.Dark

    分别为 白色 和黑色的。把这两个 theme 装饰到 Theme.Material 上来修改部分的样式为白色或者黑色。同样,对于特殊的 ActionBar 而言,也有两个衍生出来的 ThemeOverlay theme:

    • ThemeOverlay.Material.Light.ActionBar
    • ThemeOverlay.Material.Dark.ActionBar

    这两个 theme 应该只使用在 5.0 的新 属性 actionBarTheme 或者 Toolbar 上(上面的 xml 代码示例)。 这两个 theme 目前只是把  colorControlNormal 修改为 android:textColorPrimary 的值并把所有的文字和图标都设置为不透明的。

    android:theme

    android:theme 是 5.0 中新添加到 View 上的属性。需要注意的是, 该属性会传递给所有子控件,例如:

    <LinearLayout
        android:theme="@android:style/ThemeOverlay.Material.Dark">
    
        <!--这里面的所有 view 都会使用 ThemeOverlay.Material.Dark theme,除非你在单独给某个 view 设置一个新的 theme 属性  -->
    
    </LinearLayout>

    5.0 还引入了一个新的 theme 属性: colorEdgeEffect ,该属性可以定制一个 View 过度滑动的(颜色)效果, 通过上面的 方式可以很容易的修改一个 View 的 过度滑动效果;

    由于这是一个 theme 里面的 属性,所以无法直接应用到 View 上,我们可以自定义一个 Overlay theme, 在里面设置 colorEdgeEffect 的值,然后在 View 上通过 android:theme 属性来设置这个自定义的 theme 即可。

    自定义theme res/values/themes.xml

    <style name=”RedThemeOverlay” parent=”android:ThemeOverlay.Material”>

    <item name=”android:colorEdgeEffect”>#FF0000</item>

    </style>

    然后把该 theme 设置到 view 上:

    <ListView … android:theme=”RedThemeOverlay” />

    通过上面同样的方式,您可以自定义所有 theme 里面的属性。

    Theme VS Style

    那么问题来了, Theme 和 Style 到底有啥区别呢? 他们的定义方式是一模一样的,只是使用的地方不一样而已。

    Theme 是用来设置应用全局 主题风格的, 5.0 上可以让你局部的调整设计风格;

    而 Style 主要是用在 View 上的,当你在 view 上设置 style 的时候,LayoutInflater  会读取 该 style 的内容并在任意单独设置的样式之前把该内容设置到 AttributeSet 中。

    总结起来就是: Theme 是全局的;Style 是局部的。

    需要注意的是,如果您使用 AppCompat V21 的话,当前 AppCompat 只能在android.support.v7.widget.Toolbar 上使用 Theme 属性。

  • 相关阅读:
    ds
    使用js做的贪吃蛇游戏的知识总结
    使用js实现的关联表单
    使用jquery实现的计算器功能
    vue学习(2)关于过渡状态
    vue学习(1)生命周期
    vue学习(0)写在前面的一句话
    bootstrap(7)关于进度条,列表,面板
    bootstrap(6)分页,翻页,徽章效果
    异常捕获
  • 原文地址:https://www.cnblogs.com/mochaMM/p/5131464.html
Copyright © 2020-2023  润新知