【问题标题】:Android - Overriding a Style per ThemeAndroid - 覆盖每个主题的样式
【发布时间】:2015-05-27 16:01:34
【问题描述】:

有没有办法根据活动设置的主题来更改样式?例如,假设我的活动有一个样式设置为 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>

【问题讨论】:

    标签: android styles android-theme android-styles


    【解决方案1】:

    好的,这是我在发布问题 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" />
    

    当我将活动主题设置为深色或浅色时,将使用正确的 textButtenStyle

    【讨论】:

      【解决方案2】:

      将 textStyle 元素添加到您的活动样式并使其等于所需样式,然后当加载活动时,内部的所有 textView 将具有其主题内指定的样式,除非您在 textView 中覆盖它

      【讨论】:

      • 嗯不确定我明白你的意思....你能提供一个小例子吗?我希望能够覆盖每个主题的默认 textStyle。
      • 尝试类似 @style/yourTextViewStyle 在你的活动风格中
      【解决方案3】:

      试试类似的东西

      <item name="android:textAppearance">@style/yourTextViewStyle</item> 
      

      了解你的活动风格

      【讨论】:

        猜你喜欢
        • 2013-07-13
        • 1970-01-01
        • 2020-12-04
        • 2011-01-20
        • 2021-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多