Значок кнопки 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/docs/getting-started.md