Android更改浮动操作按钮颜色


531

我一直在尝试更改Material的“浮动动作按钮”的颜色,但没有成功。

<android.support.design.widget.FloatingActionButton
    android:id="@+id/profile_edit_fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end|bottom"
    android:layout_margin="16dp"
    android:clickable="true"
    android:src="@drawable/ic_mode_edit_white_24dp" />

我尝试添加:

android:background="@color/mycolor"

或通过代码:

FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.profile_edit_fab);
fab.setBackgroundColor(Color.parseColor("#mycolor"));

要么

fab.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#mycolor")));

但以上方法均无效。我也尝试过提出的重复问题中的解决方案,但是没有一个起作用。按钮保持绿色,并且也变成了正方形。

PS知道如何添加波纹效果也很高兴,也无法理解。



波纹效果在预棒棒糖设备上不可用,因为它利用了新的RenderThread
tachyonflux

@karaokyo好的,但是我怎么办呢?
Jjang

27
我认为Google确实很难做到这些事情
Joop

要以编程方式并向后兼容,请参见stackoverflow.com/questions/30966222/…–
拉尔夫·皮纳

Answers:


1049

文档中所述,默认情况下,它采用在styles.xml属性colorAccent中设置的颜色。

该视图的背景色默认为主题的colorAccent。如果您希望在运行时更改此设置,则可以通过setBackgroundTintList(ColorStateList)进行更改。

如果您想改变颜色

  • 在XML中具有属性app:backgroundTint
<android.support.design.widget.FloatingActionButton
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_add"
    app:backgroundTint="@color/orange"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:fabSize="normal" >
  • 在带有.setBackgroundTintList的代码中(下面是ywwynm的答案)

如评论中的@Dantalian所述,如果您希望将Design Support Library的图标颜色更改为v22(含)以下,则可以使用

android:tint="@color/white"     

对于v23以后的设计支持库,您可以使用:

app:tint="@color/white"   

同样对于androidX库,您需要在xml布局中设置0dp边框:

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_add"
    app:backgroundTint="@color/orange"
    app:borderWidth="0dp"
    app:elevation="6dp"
    app:fabSize="normal" />

24
对于<API 12设备,此功能在Design Support Library v23中不起作用。它在v22中正常工作,因此显然它们损坏了某些东西。
hungryghost 2015年

4
请注意,例如,如果您还想将图像颜色更改为白色,则可以使用:android:tint =“ @ android:color / white”
Dantalian 2015年

1
android:tint =“ @ color / white”对我不起作用,因为由于某种原因它无法解决它。android:tint =“#ffffff”虽然对我
有用

2
这是因为@ color / white在您的colors.xml中不存在。使用@android:color / white或创建名为白色的颜色或您需要的任何颜色
Dantalian 2015年

227
使用“ app:backgroundTint”而不是“ android:backgroundTint”
Vasil Valchev 2016年

244

Vijet Badigannavar的回答是正确的,但使用ColorStateList通常很复杂,他没有告诉我们如何做。由于我们通常关注View在正常和按下状态下更改的颜色,因此我将添加更多详细信息:

  1. 如果您想FAB在正常状态下更改的颜色,只需编写

    mFab.setBackgroundTintList(ColorStateList.valueOf(your color in int));
  2. 如果您想FAB在按下状态下更改其颜色,多亏了Design Support Library 22.2.1,您可以编写

    mFab.setRippleColor(your color in int);

    设置此属性后,长按时FAB,触摸点处会出现带有颜色的波纹,并在的整个表面露出FAB。请注意,它FAB在正常状态下不会改变的颜色。在API 21(Lollipop)以下,没有波纹效果,但FAB按时颜色仍会改变。

最后,如果要对状态实现更复杂的效果,则应深入研究ColorStateList,这是一个讨论它的SO问题:如何以编程方式创建ColorStateList?

更新: 感谢@Kaitlyn的评论。要使用backgroundTint作为颜色来删除FAB的笔划,可以app:borderWidth="0dp"在xml中进行设置。


3
为此,我不知道如何使用ColorStateList。但是,您的代码使我的FAB带有主题强调色的笔触(轮廓)。您是否知道我如何删除该笔划(或更改其颜色),并使FAB具有一种特殊颜色,看起来该特殊颜色是强调颜色?
Kaitlyn Hanrahan

@KaitlynHanrahan请参阅我的更新。谢谢你的评论。
ywwynm

效果非常好-Lollypop和Kitkat看起来一样,即使两者都有很少的阴影,因此FAB也会在背景中以相同的颜色弹出(我在工具栏上有一部分)。非常感谢!很简单,但我不知道自己是否会发现。
Kaitlyn Hanrahan 2015年

有没有办法以app:borderWidth编程方式设置?谢谢
斯塔克

@Štarke好吧,在查看的源代码之后FloatingActionButton,由于没有的setter,恐怕您现在无法以编程方式进行设置mBorderWidth
ywwynm

122

正如Vasil Valchev在评论中指出的那样,它看起来比表面上简单,但是有一个细微的差别,我没有注意到我的XML。

<android.support.design.widget.FloatingActionButton
    android:id="@+id/profile_edit_fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end|bottom"
    android:layout_margin="16dp"
    android:clickable="true"
    android:src="@drawable/ic_mode_edit_white_24dp"
    app:backgroundTint="@android:color/white"/>

注意它是:

app:backgroundTint="@android:color/white"

不是

android:backgroundTint="@android:color/white"

7
这很重要,因为它们是两个完全不同的事物:android:backgroundTint=""来自Api 21级,是Lollipop Material Design的一部分,在Lollipop下将被忽略。另外,FAB由于它不是纯色,因此不能完全改变颜色。您必须使用app:一个使其工作。
creativecreatorormaybenot

1
谢谢,使用 android:color导致我的应用崩溃,这真让我发疯!感谢您保存我的应用以及理智的内容;-)
Kapenaar

@Kapenaar没问题,在注意到之前也挠了一下我的头;)
HenriqueMS

这将如何以编程方式工作,因为在Java方面,XML中没有像app:和android:一样的区别。
marienke '17

@marienke,您可以使用ColorStatesList进行设置,发布新问题并在此处发布链接,这样我就可以回答;)
HenriqueMS

58

如果尝试使用应用程序更改FAB的颜色,则存在一些问题。按钮框的颜色不同,因此您必须执行以下操作:

app:backgroundTint="@android:color/transparent"

并在代码中设置颜色:

actionButton.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.white)));

2
适用于正常颜色。如果我给定了#44000000这样的alpha颜色,则可以重现框架颜色问题。
Dinesh

5
getResources.getColor()已过时,请考虑使用ContextCompat.getColor(context,your colour); 代替。希望能
有所

51

只是使用,

app:backgroundTint="@color/colorPrimary"

不要使用

android:backgroundTint="@color/colorPrimary"

嗯,这导致android studio自动完成给结果使用android:backgroundTint,这个答案很好
Yudi karma

31

FAB的颜色基于您的colorAccent

<style name="AppTheme" parent="Base.Theme.AppCompat.Light">
    <item name="colorAccent">@color/accent</item>
</style>

好吧,默认颜色不是绿色。您在哪里设置绿色?
tachyonflux

1
我没有。如您所见,这个xml是我设置按钮布局的唯一位置...
Jjang

也许您应该只使用FAB创建一个新项目,然后发布整个代码。
tachyonflux

3
哇...我基本上只是问你做同样的事情,而你不愿意这样做。认为您的代码是足够的,但是您对我的代码的补充还不够,这是对您的伪善。创建MCVE由申请者承担。谢谢。
tachyonflux

2
现在,基于主题属性映射,浮动操作按钮(我已经验证了自己)的颜色已变为colorSecondarycom.google.android.material:material:1.1.0-alpha02
ievgen,


16

其他解决方案可能会起作用。这是10磅大猩猩的方法,其优点是可广泛应用于这种情况和类似情况:

Styles.xml:

<style name="AppTheme.FloatingAccentButtonOverlay" >
    <item name="colorAccent">@color/colorFloatingActionBarAccent</item>
</style>

您的布局xml:

<android.support.design.widget.FloatingActionButton
       android:theme="AppTheme.FloatingAccentButtonOverlay"
       ...
 </android.support.design.widget.FloatingActionButton>

嗯,看来这应该可行,但是我在布局文件中遇到编译器错误String types not allowed (at 'theme' with value 'AppTheme.FloatingAccentButtonOverlay')。也许我失去了与styles.xml点....
斯科特比格斯

@ScottBiggs使用,android:theme="@style/AppTheme.FloatingAccentButtonOverlay"但是此solutin不适用于我……
jpact

没有coloarAccent属性的API 16呢?
Dushyant Suthar '17

12

该文件建议默认使用@ color / accent。但是我们可以使用

fab.setBackgroundTintList(ColorStateList)

还记得

使用该库的最低API版本是15,因此您需要对其进行更新!如果您不想这样做,则需要定义一个自定义可绘制对象并进行装饰!


可以,但是我必须将api 21+作为目标。如果我的目标是api 8,则无法调用此方法。
Jjang 2015年

只需包含由Google“ com.android.support:design:22.2.0”发布的设计库即可。可以在非棒棒糖版本的设备上使用!干杯!!
Vijet Badigannavar

当然可以,但是这是此代码上的错误:调用需要API级别21(当前最小值为8):android.widget.ImageView#setBackgroundTintList
Jjang

使用该库的最低API版本是15,因此您需要对其进行更新!如果您不想这样做,则需要定义一个自定义可绘制对象并进行装饰!
Vijet Badigannavar

哦谢谢!我不知道,以为是21岁,因为这就是错误的意思。请将此作为答案发布,我会接受的!
Jjang 2015年

10

使用以下行更改浮动操作按钮的背景色

app:backgroundTint="@color/blue"

更改浮动操作按钮图标的颜色

android:tint="@color/white"     

8

多亏了自动完成功能。经过几次尝试和试验,我很幸运:

    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    card_view:backgroundTint="@color/whicheverColorYouLike"

-或-(两者基本上是一样的)

    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:backgroundTint="@color/whicheverColorYouLike"

这适用于具有设计库23.1.0的API版本17。


8

我遇到了同样的问题,所有问题都使我的头发hair了。感谢这个 https://stackoverflow.com/a/35697105/5228412

我们能做的..

 favourite_fab.setImageDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.favourite_selected));

它对我来说效果很好,并希望其他人能够到达这里。


虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
巴尔加夫饶

8
 <android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    app:elevation="6dp"
    app:backgroundTint="@color/colorAccent"
    app:pressedTranslationZ="12dp"
    android:layout_margin="@dimen/fab_margin"
    android:src="@drawable/add"/>

请注意,您在res / values / color.xml中添加了颜色,并将该属性包括在fab中

   app:backgroundTint="@color/addedColor"

8

默认情况下,如果使用Material ThemeMaterial组件 FloatingActionButton,它将采用styles.xmlattribute中设置的颜色colorSecondary

  • 您可以app:backgroundTint在xml中使用该属性:
<com.google.android.material.floatingactionbutton.FloatingActionButton
       ...
       app:backgroundTint=".."
       app:srcCompat="@drawable/ic_plus_24"/>
  • 您可以使用 fab.setBackgroundTintList();

  • 您可以使用<item name="backgroundTint">属性来自定义样式

  <!--<item name="floatingActionButtonStyle">@style/Widget.MaterialComponents.FloatingActionButton</item> -->
  <style name="MyFloatingActionButton" parent="@style/Widget.MaterialComponents.FloatingActionButton">
    <item name="backgroundTint">#00f</item>
    <!-- color used by the icon -->
    <item name="tint">@color/...</item>
  </style>
  • 从材料组件的1.1.0版本开始,您可以使用new materialThemeOverlay属性来覆盖某些组件的默认颜色:
  <style name="MyFloatingActionButton" parent="@style/Widget.MaterialComponents.FloatingActionButton">
    <item name="materialThemeOverlay">@style/MyFabOverlay</item>
  </style>

  <style name="MyFabOverlay">
    <item name="colorSecondary">@color/custom2</item>
    <!-- color used by the icon -->
    <item name="colorOnSecondary">@color/...</item>
  </style>

在此处输入图片说明


7

素材1.1.0中浮动动作按钮的新主题属性映射

在您的应用主题中:

  • 设置colorSecondary设置FAB背景的颜色(映射到backgroundTint)
  • 设置colorOnSecondary可以设置图标/文本的颜色和FAB的波纹颜色(映射为tint和rippleColor)

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <!-- ...whatever else you declare in your app theme.. -->
    <!-- Set colorSecondary to change background of FAB (backgroundTint) -->
    <item name="colorSecondary">@color/colorSecondary</item>
    <!-- Customize colorSecondary to change icon/text of FAB (maps to tint and rippleColor) -->
    <item name="colorOnSecondary">@android:color/white</item>
</style>

最后,有人为FAB背景和前景(图标)颜色提供了简单的解决方案。
ManuelTS


3

我做到了这个android:background =“ @ color / colorAccent”,我只是转到文件夹res,然后单击文件夹值,然后单击colors.xml中的colors.xml,我只是更改了colorAccent的颜色,并在android:background中调用了它和完成


2

我们缺少的一点是,在按钮上设置颜色之前,重要的是要为该颜色设置所需的值。因此,您可以转到“值”>“颜色”。您将找到默认的颜色,但是您也可以通过复制和粘贴颜色,更改颜色和名称来创建颜色。然后...当您更改浮动按钮的颜色(在activity_main中)时,可以选择已创建的按钮

示例-值>具有默认颜色的颜色+我创建的3种以上颜色的代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <color name="corBotaoFoto">#f52411</color>
    <color name="corPar">#8e8f93</color>
    <color name="corImpar">#494848</color>

</resources>

现在,使用我创建的颜色并将其命名为“ corPar”的浮动操作按钮:

<android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_input_add"
        android:tint="#ffffff"
        app:backgroundTint="@color/corPar"/>

它为我工作。祝好运!


1

如果您的浮动操作按钮没有可绘制对象,则可以使用以下方法以编程方式更改色调:

fab.getBackground().mutate().setTint(ContextCompat.getColor(yourContext, R.color.anyColor));

那就是我正在寻找的解决方案。我有一个带有backgrountTint的简单晶圆厂,直到找到了它,我才能找到以编程方式更改它的方法。
Redar

0

在color.xml文件中添加颜色

在color.xml文件中添加颜色,然后添加以下代码行... floatingActionButton.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.fab2_color)));


0

如果要以编程方式更改颜色,可以使用此代码

floating.setBackgroundTintList(getResources().getColorStateList(R.color.vermelho));

0

采用

app:backgroundTint =“ @ color / orange”中


<com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/id_share_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/share"
        app:backgroundTint="@color/orange"
        app:fabSize="mini"
        app:layout_anchorGravity="end|bottom|center" />



</androidx.coordinatorlayout.widget.CoordinatorLayout>

0

对于Material design,我只是这样更改了浮动动作按钮的颜色,在浮动动作按钮xml中添加了以下两行。并做了,

 android:backgroundTint="@color/colorPrimaryDark"
 app:borderWidth="0dp"

0

在科特林:

val gray = getColor(requireContext(), R.color.green)
binding.fabSubmit.backgroundTintList = ColorStateList.valueOf(gray)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.