Понимание стилей - PullRequest
       11

Понимание стилей

0 голосов
/ 15 декабря 2018

Я пытаюсь установить собственный цвет для своих кнопок в приложении Android, но значение, заданное для accentColor, всегда используется в качестве цвета фона кнопки.Я пытаюсь установить глобальный цвет для всех кнопок без необходимости указывать стили или темы для каждой кнопки в отдельности.

Не могли бы вы объяснить, как работает стиль в Android?Я понимаю основы, но переопределение существующих тем никогда не работает для меня :(

styles.xml

<resources>

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:titleTextColor">#ffffff</item>
    <item name="android:buttonStyle">@style/AppTheme.Button</item>

</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.Button" >
    <item name="android:backgroundTint">@color/colorPrimaryDark</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Мне удалось решить проблему.Главное, на что следует обратить внимание, это то, что я использую Theme.MaterialComponents , а не AppCompact.

Я определил новый стиль и установил его на buttonStyle, который ссылается на стиль для кнопки AppCompact.Чтобы установить стиль для кнопки материала, мне пришлось использовать «materialButtonStyle» вместо «buttonStyle».

Все соответствующие свойства, которые могут быть переопределены для MaterialComponents, можно найти в проектной документации материала: https://www.material.io/develop/android/components/material-button/

Таким образом, окончательный код выглядит следующим образом:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="colorSecondary">@color/colorAccent</item>
        <item name="floatingActionButtonStyle">@style/AppTheme.Test</item>
        <item name="materialButtonStyle">@style/AppTheme.Button</item>
        <!--<item name="buttonStyle">@style/Widget.MaterialComponents.Button.Icon</item>-->
    </style>

    <style name="AppTheme.Button" parent="@style/Widget.MaterialComponents.Button">
        <item name="android:backgroundTint">#D400EB</item>
    </style>
    <style name="AppTheme.Test" parent="@style/Widget.MaterialComponents.FloatingActionButton">
        <item name="backgroundTint">#A305B1</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>

</resources>
0 голосов
/ 15 декабря 2018

Краткий ответ: попробуйте перейти к исходному коду о том, как Theme.MaterialComponents.Light.NoActionBar определяет стиль для кнопок, и переопределите эти атрибуты.

Стиль Android работает путем объединения всех определенныхатрибуты в теме.Например, у вас есть AppTheme, который включает темы для каждого встроенного представления.Если вы создаете новую тему для своей кнопки и определяете только пару атрибутов, то, что делает android studio, это объединяет все атрибуты, определенные в AppTheme, с вашими новыми атрибутами.Поэтому, если вы хотите переопределить кнопки, вам нужно углубиться и выяснить, какие именно атрибуты определены в общих AppTheme, установленных вами в приложении, они могут не совпадать.

Например,Вот как я изменил цвет всех кнопок в моем приложении, поскольку они использовали для него глобальный атрибут: В общем файле styles.xml я поставил:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="colorButtonNormal">?myCustomColor</item>
    ...
</style>

Но если бы я хотелизмените атрибут backgroundTint моих кнопок, я должен был сделать это:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="colorButtonNormal">?myCustomColor</item>
    <item name="android:buttonStyle">@style/AppButtonStyle</item>
    ...
</style>

<style name="AppButtonStyle" parent="Widget.AppCompat.Button">
    <item name="android:backgroundTint">?attr/colorAccent</item>
</style>

Кроме того, зацените этот классный пост Medium , чтобы узнать о других возможностях для разработчиков в этой теме.

...