Android - 在主题中覆盖样式

12

有没有一种方法可以根据活动所设置的主题来更改样式?例如,假设我的活动具有将样式设置为TextViewStyle的TextView。

<TextView
   style="@style/TextViewStyle"        
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Text"/>

这是我的TextView样式

<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>
3个回答

27

好的,以下是我在发布问题后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。

0
在您的活动样式中添加一个textStyle元素,并将其设置为所需的样式,然后当活动加载时,所有内部的textView都将具有指定在其主题中的样式,除非您在textView中覆盖它。

嗯,我不太确定你的意思... 你能提供一个小例子吗?我想要能够根据主题覆盖默认的文本样式。 - AhmedW
尝试像这样做:<item name="android:textAppearance">@style/yourTextViewStyle</item>在你的活动样式中。 - Exception

0

尝试类似这样的东西

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

在你的活动样式中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接