Android-переопределение стиля для каждой темы

есть ли способ изменить стиль на основе того, какая тема установлена на activity? например, предположим, что моя активность имеет textview со стилем, установленным в TextViewStyle

<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>

в моих стилях.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 ответов


Ok вот как я этого достиг, через 1 час после публикации вопроса! Может быть полезно для кого-то еще!

сначала в attrs.xml я определил следующее:

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

тогда в стиле.в 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


добавьте элемент textStyle в свой стиль активности и сделайте его равным желаемому стилю, тогда при загрузке активности все textViews внутри будут иметь стиль, указанный внутри его темы, если вы не переопределите его в своем textView


попробуйте что-то вроде

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

внутри вашего стиля деятельности