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>
внутри вашего стиля деятельности