Android - 覆盖每个主题的样式

标签 android styles android-theme android-styles

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

现在,当我将主题设置为深色时,我希望此主题覆盖我在 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" />

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

关于Android - 覆盖每个主题的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30487616/

相关文章:

android - Android 中的自定义主题

android - 检索项目 : 'Theme.AppCompat.Light' in eclipse 的父项时出错

javascript - Android提交使用jquery的https登录表单

Android DownloadManager remove() - 如何确定 remove() 操作何时完成?

android - 通过 GET 方法发送值

更改字体后的 Android 字体样式不起作用

Android FullScreen 主题降低显示按钮的高度

android - Admob 在第二次请求之前不会展示广告

arrays - 在 react 中将类添加到数组的一个元素

android - 在哪里重新创建 Activity ?