2017-02-06 4 views
0

Я использую две темы для приложения для Android, AppTheme и AppThemeDark. Я создал пользовательский стиль кнопки для каждого в определениях темы:Переопределить фон Android в пользовательском стиле для одной темы, но не другой

<!-- Theme definitions --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    ... 
    <item name="android:buttonStyle">@style/ButtonStyle</item> 
    ... 
</style> 

<style name="AppThemeDark" parent="Theme.AppCompat.DayNight.NoActionBar"> 
    ... 
    <item name="android:buttonStyle">@style/ButtonStyleDark</item> 
    ... 
</style> 

<!-- Button styles --> 
<style name="ButtonStyle" parent="@style/Widget.AppCompat.Button"> 
    <item name="android:ellipsize">end</item> 
    <item name="android:maxLines">2</item> 
</style> 

<style name="ButtonStyleDark" parent="ButtonStyle"> 
    <item name="android:background">@drawable/gray_button_bg</item> 
</style> 

Обратите внимание, что моя кнопка AppTheme, ButtonStyle, не переопределяет фон Widget.AppCompat.Button, но стиль кнопки AppThemeDark наследует ButtonStyle и изменяет задний план.

Теперь я хотел бы расширить этот buttonStyle новым пользовательским стилем для специальных кнопок, например. PrimaryButton. В случае AppTheme я не хочу менять фон кнопки. В случае AppThemeDark i do хотите изменить фон кнопки.

Я хотел бы определить PrimaryButton и иметь либо наследовать фон (в случае AppTheme), либо использовать новый фон (AppThemeDark). Что-то вроде этого:

<style name="PrimaryButton"> 
    <item name="android:background">?attr/drawablePrimaryButtonBackground</item> 
</style> 

Но, насколько я могу сказать, что нет никакого способа определить атрибут в AppThemeDark как новая вытяжка и AppTheme как «наследует от родителей». Очевидно, что настройка прозрачности делает кнопку фона в AppTheme прозрачной.

Является ли мой единственный способ выяснить, что drawable используется для фона в Widget.AppCompat.Button и определить его локально?

ответ

0

Для того, чтобы ответить на мой собственный вопрос ...

  1. Вы можете выкопать частный Android ресурс и использовать локальную копию, чтобы сохранить фон. Это блокирует вас в одну конкретную версию Android, которую можно вытащить (если вы не скопируете несколько версий).
  2. Вы можете установить целые стили как атрибуты, если стили между вашими двумя темами достаточно различны, чтобы оправдать его:

attrs.xml:

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

styles.xml:

<!-- Theme definitions --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    ... 
    <item name="stylePrimaryButton">@style/PrimaryButton</item> 
    ... 
</style> 

<style name="AppThemeDark" parent="Theme.AppCompat.DayNight.NoActionBar"> 
    ... 
    <item name="stylePrimaryButton">@style/PrimaryButtonDark</item> 
    ... 
</style> 

<!-- Primary button styles --> 
<style name="PrimaryButton"> 
    <!-- no need to override anything --> 
</style> 

<style name="PrimaryButtonDark"> 
    <item name="android:background">@drawable/dark_background</item> 
</style> 

макет.xml:

<Button style="?attr/stylePrimaryButton" 
    ... 
Смежные вопросы