Android – 覆盖每个主题的样式

有没有办法根据活动上设置的主题来更改样式?例如,假设我的活动有一个样式设置为TextViewStyle的textview
<TextView
   style="@style/TextViewStyle"        
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Text"/>

这是我的TextViewStyle

<style name="TextViewStyle" parent="android:style/Widget.TextView">
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">8sp</item>
        <item name="android:textColor">@android:color/holo_blue_dark</item>
    </style>

在我的Styles.xml中,我有两个主题

<style name="AppThemeLight" parent="android:Theme.Material.Light">

   </style>


   <style name="AppThemeDark" parent="android:Theme.Material">

   </style>

现在,当我将主题设置为Dark时,我希望此主题覆盖我在TextViewStyle中设置的某些值.我怎么能这样做?我尝试了以下,但它不起作用

<!-- Override TextViewStyle style for AppThemeLight-->
            <style name ="AppThemeLight.TextBlockStyle" parent="@style/TextBlockStyle">
                <item name="android:textColor">@color/my_purple</item>
                <item name="android:textSize">20sp</item>
            </style>
<!-- Override TextViewStyle style for AppThemeDark-->
            <style name ="AppThemeDark.TextBlockStyle" parent="@style/TextBlockStyle">
                <item name="android:textColor">@color/my_green</item>
                <item name="android:textSize">40sp</item>
            </style>

解决方法

好的,这是我如何在发布问题后1小时实现这一目标!可能对别人有帮助!

首先在attrs.xml中我定义了以下内容:

<attr name="textBlockStyle" format="reference"/>

然后在style.xml中

<style name="TextBlockStyle" parent="android:style/Widget.TextView">
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">8sp</item>
        <item name="android:textColor">@android:color/holo_blue_dark</item>
    </style>

    <style name="AppThemeLight" parent="android:Theme.Material.Light">
        <item name="android:windowNoTitle">true</item>
        <item name="textBlockStyle">@style/AppThemeLightTextBlockStyle</item>
    </style>


     <style name="AppThemeDark" parent="android:Theme.Material">
         <item name="android:windowNoTitle">true</item>
        <item name="textBlockStyle">@style/AppThemeDarkTextBlockStyle</item>
    </style>



    <!-- Override TextBlockStyle style for AppThemeLight -->
    <style name ="AppThemeLightTextBlockStyle" parent="@style/TextBlockStyle">
        <item name="android:textColor">@color/my_purple</item>
        <item name="android:textSize">20sp</item>
    </style>
    <!-- Override MyButton style for AppThemeDark -->
    <style name ="AppThemeDarkTextBlockStyle" parent="@style/TextBlockStyle">
        <item name="android:textColor">@color/my_green</item>
        <item name="android:textSize">40sp</item>
    </style>

请注意我如何使用我定义的属性来引用样式

<item name="textBlockStyle">@style/AppThemeLightTextBlockStyle</item>

最后,在我的元素上,我将样式设置为“style =”?textBlockStyle“:

<TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        style="?textBlockStyle"
        android:text="...."
        android:gravity="center" />

当我将活动主题设置为Dark或Light时,将使用正确的textButtenStyle

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...