Значок кнопки Android FAB всегда черный с темой MaterialComponents

Я создаю приложение для Android и использую библиотеки AndroidX и тему дизайна материалов. Моя тема приложения на styles.xml является:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

У меня есть следующая кнопка FAB из библиотеки:

<com.leinardi.android.speeddial.SpeedDialView
        android:id="@+id/work_log_fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        app:layout_behavior="@string/speeddial_scrolling_view_snackbar_behavior"
        app:sdMainFabClosedSrc="@drawable/ic_add_white_24dp"
        app:sdOverlayLayout="@id/overlay" />

А также попробовал FAB по умолчанию:

<com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:src="@drawable/ic_add_white_24dp"
        android:layout_margin="16dp" />

Независимо от цвета значка (векторное изображение), значок внутри FAB (из библиотеки и по умолчанию) всегда черный. Я сузил проблему до темы дизайна материала, так как с помощью старого Theme.AppCompat.Light.DarkActionBar вместо нового Theme.MaterialComponents.Light.DarkActionBar значок внутри FAB позволяет получить цвет исходного вектора.

Кто-нибудь знает, почему это происходит и как это решить?

15 ответов

Я решил это с помощью:

app:tint="@color/COLOR_OF_ICON"

и не:

android:tint="@color/COLOR_OF_ICON"

Не уверен, почему.. Надеюсь, это поможет!

За MaterialComponents В теме вы можете определить следующие цвета.

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primaryDark</item>
        <item name="colorPrimaryVariant">@color/primaryVariant</item>
        <item name="colorOnPrimary">@color/onPrimary</item>
        <item name="colorSecondary">@color/secondary</item>
        <item name="colorSecondaryVariant">@color/secondaryVariant</item>
        <item name="colorOnSecondary">@color/onSecondary</item>
        <item name="colorAccent">@color/accent</item>
        <item name="colorSurface">@color/surface</item>
        <item name="colorOnSurface">@color/onSurface</item>
        <item name="colorError">@color/error</item>
        <item name="colorOnError">@color/onError</item>
        <item name="colorButtonNormal">@color/buttonNormal</item>
        <item name="colorControlNormal">@color/controlNormal</item>
        <item name="colorControlActivated">@color/controlActivated</item>
        <item name="colorControlHighlight">@color/controlHighlight</item>
        <item name="colorBackgroundFloating">@color/backgroundFloating</item>
    </style>

colorSecondary это ответственный цвет для FloatingActionButton,

В вашем AppTheme Вы не бросили вызов colorSecondary, Итак, он взял по умолчанию черный цвет от родителя Theme.MaterialComponents.Light.DarkActionBar,

Ссылка: Android Dev Summit, 2018 - Компоненты материального дизайна

Как сказано в этом ответе, если значок имеет несколько цветов или если вы хотите сохранить исходный цвет значка, назначьте @null как оттенок:

app:tint="@null"

Согласно странице документации GitHub для FloatingActionButton библиотеки компонентов материалов, единственные атрибуты, которые влияют на значок, это

  • app:srcCompat
  • app:tint
  • app:maxImageSize

В этом случае, так как ваш цвет определяется как константа (#FFF), единственный, который, кажется, имеет смысл app:tint, Возможно, что-то в вашей теме установило это на черный?

Вы должны иметь возможность переопределить его, установив app:tint="#FFF" на вашем FAB.

Ваш значок многоцветный

Только добавить

app:tint="@null"

но если вы хотите только изменить цвет

@dimen/fab_margin -> 16dp

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/fab"
    style="@style/Widget.MaterialComponents.FloatingActionButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    app:backgroundTint="@color/colorAccent"
    app:srcCompat="@drawable/ic_add"
    app:tint="@color/colorWhite" />

Стиль:

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

Программно в котлине:

fab.setImageDrawable(ContextCompat.getDrawable(контекст!!, R.drawable.your_drawable))

В моем случае я просто следую этому

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/bottom_home"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/ic_home"
    android:scaleType="centerCrop"
    android:src="@drawable/ic_add_sign"
    app:backgroundTint="@color/app_dark_green"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:fabSize="normal"
    app:layout_anchor="@id/nav_view"
    app:tint="#FFF" />

И мой результат

Используйте приложение:tint="@color/white"

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="16dp"
        app:tint="@color/white"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:srcCompat="@drawable/ic_done"/>

Использование векторного ресурса в качестве значка для FAB. Вот что у меня сработало.

app:tint меняет цвет значка вектора, а app:backgroundTint меняет фон FAB.

      <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/idFABAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:gravity="bottom"
        android:layout_gravity="bottom|right"
        android:layout_marginBottom="70dp"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="18dp"
        android:layout_marginTop="18dp"
        android:layout_marginEnd="18dp"
        app:srcCompat="@drawable/ic_baseline_home_24"
        app:tint="@color/white"
        app:backgroundTint="@color/purple_500"
        android:contentDescription="TODO" />

Я искал это, и следующий код сработал.

      android:backgroundTint="@color/primarycolor"
    android:textColor="@color/white"
    app:iconTint="@color/white"

Когда вы используете тему Theme.Material3.DayNight.NoActionBar. Чтобы изменить цвет кнопки плавающего действия, используйте следующее

        <item name="colorPrimaryContainer">@color/primary</item> // this will give the color to fab
  <item name="colorOnPrimaryContainer">@color/white</item> // this sets the color of the icon on fab

Чтобы узнать больше о темах, вы можете обратиться к репозиторию Google Git https://github.com/material-comComponents/material-comComponents-android/blob/master/docs/comComponents/FloatingActionButton.md#container-attributes .

Просто хочу добавить свои 2 цента. Есть несколько вариантов, как исправить проблему с цветом для компонентов материала. Большинство из них уже освещены в ответах.

Однако есть и другой и, возможно, более общий подход в данном случае. Вы можете установить «floatingActionButtonStyle» по умолчанию для своей темы, которая будет использоваться для всех FloatingActionButtons.

      <style name="Theme.Design" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="floatingActionButtonStyle">@style/Theme.Design.FloatingActionButton</item>
</style>

<style name="Theme.Design.FloatingActionButton" parent="Widget.MaterialComponents.FloatingActionButton">
    <item name="tint">@null</item>
</style>

Более подробная информация о стилях FloatingActionButtons доступна здесь Theming Fabs

Я также использую библиотеку быстрого набора Heinardi. Согласно документу о настройке элементов, вы можете определить тему для компонента:

      <style name="Theme.FAB">
    <item name="colorPrimary">@color/Primary</item>
    <item name="colorAccent">@color/Accent</item>
    <item name="colorOnSecondary">@color/white</item>
</style>

Обратите внимание, что colorPrimary определяет цвет расширенных кнопок,

colorAccent цвет основной кнопки,

colorOnSecondary цвет значка.

Затем вы можете добавить тему в SpeedDialView:

      <com.leinardi.android.speeddial.SpeedDialView
    android:id="@+id/speedDial"
    android:theme="@style/Theme.FAB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    app:sdMainFabClosedSrc="@drawable/ic_add_white"
    app:sdOverlayLayout="@id/speedDialOverlay" />
      app:backgroundTint="@color/white"
app:fabSize="mini"
app:srcCompat="@drawable/ic_"
app:tint="@null"

Цвет значков переопределяется параметром colorOnSecondary (см. themes.xml).

Чтобы указать цвет значка, который вы хотите, вы должны использовать:

      app:tint="@colour/icon_colour"

И для фона:

      app:backgroundTint="@colour/icon_colour"

Вы можете автоматически изменить эти цвета по теме, используя /questions/45567624/temyi-prilozheniya-izmeneniya-i-imageview-src-na-osnove-imeni-temyi-prilozheniya/45567636#45567636

реализация 'com.google.android.material:material:1.2.0-alpha05'

<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
...
app:iconTint="@color/white"
app:icon="@drawable/ic_add_white"
...

Finnaly app:iconTintизменил цвет значка. Я нашел это в исходном коде:

https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/floatingactionbutton/res/values/styles.xml

Конечно, вам нужно предварительно проверить инструкцию:https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md

Другие вопросы по тегам