Android更改浮动操作按钮颜色

Jja*_*ang 488 java android floating-action-button android-5.0-lollipop

一直试图改变材质的浮动动作按钮颜色,但没有成功.

<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" />
Run Code Online (Sandbox Code Playgroud)

我试过补充一下

android:background="@color/mycolor"
Run Code Online (Sandbox Code Playgroud)

或通过代码

FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.profile_edit_fab);
fab.setBackgroundColor(Color.parseColor("#mycolor"));
Run Code Online (Sandbox Code Playgroud)

要么

fab.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#mycolor")));
Run Code Online (Sandbox Code Playgroud)

但以上都没有奏效.我也在"重复的问题"中尝试了解决方案,但它们都没有工作,按钮保持绿色并且也变成了正方形.

我想详细解答一下,谢谢.

PS知道如何添加涟漪效果也不错,也无法理解.

Mar*_*rko 987

文档中所述,默认情况下,它采用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" >
Run Code Online (Sandbox Code Playgroud)
  • .setBackgroundTintList的代码中(由ywwynm回答如下)

正如@Dantalian在评论中提到的,如果你想改变图标颜色,你可以使用

android:tint="@color/white"     
Run Code Online (Sandbox Code Playgroud)

  • 使用"app:backgroundTint"而不是"android:backgroundTint" (216认同)
  • 这在<API 12设备的设计支持库v23中不起作用.它在v22工作,所以他们打破了一些东西,显然. (22认同)
  • 请注意,如果您还想将图像颜色更改为白色,例如您可以使用:android:tint ="@ android:color/white" (4认同)
  • 这是因为您的colors.xml中不存在@ color/white.使用@android:color/white或创建一个名为white或任何你需要的颜色 (2认同)

yww*_*ynm 227

Vijet Badigannavar的答案是正确的,但使用ColorStateList通常很复杂,他没有告诉我们该怎么做.由于我们经常专注于View在正常和按压状态下改变颜色,我将添加更多细节:

  1. 如果你想FAB在正常状态下改变颜色,你可以写

    mFab.setBackgroundTintList(ColorStateList.valueOf(your color in int));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果你想改变FAB按下状态的颜色,感谢Design Support Library 22.2.1,你可以写

    mFab.setRippleColor(your color in int);
    
    Run Code Online (Sandbox Code Playgroud)

    通过设置此属性,当您长FAB按时,您的颜色的波纹将出现在您的触摸点并显示为整个表面FAB.请注意,FAB在正常状态下它不会改变颜色.在API 21(Lollipop)下面,没有涟漪效应,但是FAB当你按下它时,颜色仍会改变.

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

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

  • 谢谢你,我不知道如何使用ColorStateList.但是,您的代码会为我的FAB留下主题强调颜色的笔触(轮廓).你有什么想法我可以删除那个笔划(或改变它的颜色,而不是)并且有一个特殊颜色的FAB,看起来特殊的颜色是强调颜色? (3认同)
  • 此解决方案不支持库23.2.0 (2认同)

Hen*_*eMS 116

正如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"/>
Run Code Online (Sandbox Code Playgroud)

注意它是:

app:backgroundTint="@android:color/white"
Run Code Online (Sandbox Code Playgroud)

不是

android:backgroundTint="@android:color/white"
Run Code Online (Sandbox Code Playgroud)

  • 这很重要,因为它们是两个完全不同的东西:`android:backgroundTint =""`来自*Api等级21*并且是棒棒糖材料设计的一部分,在Lollipop下面会被忽略.它也不会完全改变`FAB`颜色,因为它不是纯色.你必须使用`app:`one来使它工作. (7认同)

小智 53

如果您尝试使用应用程序更改FAB的颜色,则存在一些问题.按钮框有不同的颜色,所以你必须做的事情:

app:backgroundTint="@android:color/transparent"
Run Code Online (Sandbox Code Playgroud)

并在代码中设置颜色:

actionButton.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.white)));
Run Code Online (Sandbox Code Playgroud)

  • 不推荐使用getResources.getColor(),考虑使用ContextCompat.getColor(context,你的颜色); 代替.希望能帮助到你 (5认同)
  • 这适用于正常颜色.如果我给出像#44000000这样的alpha颜色,则帧颜色问题是可重现的. (2认同)

Ash*_*kol 48

只是用,

app:backgroundTint="@color/colorPrimary"
Run Code Online (Sandbox Code Playgroud)

不要用,

android:backgroundTint="@color/colorPrimary"
Run Code Online (Sandbox Code Playgroud)


tac*_*lux 30

FAB根据您的颜色着色colorAccent.

<style name="AppTheme" parent="Base.Theme.AppCompat.Light">
    <item name="colorAccent">@color/accent</item>
</style>
Run Code Online (Sandbox Code Playgroud)

  • 不工作.颜色保持绿色. (3认同)
  • 哇...我基本上只是要求你做同样的事情,你不愿意这样做.相信你的代码足够,但你对代码的补充是不够的,这是非常虚伪的.要求者创建一个[MCVE](http://stackoverflow.com/help/mcve).谢谢. (3认同)
  • 基于[Theme Attribute Mapping](https://material.io/develop/android/components/floating-action-button/),现在(我已验证自己)的“浮动操作按钮”已变为** colorSecondary ** (_com.google.android.material:material:1.1.0-alpha02_) (2认同)

小智 22

mFab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(mContext,R.color.mColor)));
Run Code Online (Sandbox Code Playgroud)


luc*_*992 18

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

在您的应用主题中:

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

<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>
Run Code Online (Sandbox Code Playgroud)


Rob*_*ies 15

其他解决方案也可行.这是10磅的大猩猩方法,具有广泛适用于此类和类似情况的优点:

Styles.xml:

<style name="AppTheme.FloatingAccentButtonOverlay" >
    <item name="colorAccent">@color/colorFloatingActionBarAccent</item>
</style>
Run Code Online (Sandbox Code Playgroud)

你的布局xml:

<android.support.design.widget.FloatingActionButton
       android:theme="AppTheme.FloatingAccentButtonOverlay"
       ...
 </android.support.design.widget.FloatingActionButton>
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 14

使用Material Theme材质组件 FloatingActionButton默认情况下,它采用styles.xml属性中设置的颜色colorSecondary

  • 您可以app:backgroundTint在 xml 中使用该属性:
<com.google.android.material.floatingactionbutton.FloatingActionButton
       ...
       app:backgroundTint=".."
       app:srcCompat="@drawable/ic_plus_24"/>
Run Code Online (Sandbox Code Playgroud)
  • 您可以使用 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>
Run Code Online (Sandbox Code Playgroud)
  • 从材质组件的1.1.0版本开始,您可以使用新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>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Vij*_*var 12

该文档表明它默认采用@ color/accent.但是我们可以通过使用来覆盖代码

fab.setBackgroundTintList(ColorStateList)
Run Code Online (Sandbox Code Playgroud)

还记得,

使用此库的最低API版本为15,因此您需要更新它!如果你不想这样做,那么你需要定义一个自定义drawable并装饰它!


小智 8

感谢自动完成.经过几次打击和试验后,我很幸运:

    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    card_view:backgroundTint="@color/whicheverColorYouLike"
Run Code Online (Sandbox Code Playgroud)

- 或 - (两者基本相同)

    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:backgroundTint="@color/whicheverColorYouLike"
Run Code Online (Sandbox Code Playgroud)

这适用于API版本17和设计库23.1.0.


小智 8

我遇到了同样的问题,所有的问题都让我抓狂。感谢这个 /sf/answers/2498797381/

我们能做的..

 favourite_fab.setImageDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.favourite_selected));
Run Code Online (Sandbox Code Playgroud)

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


小智 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"/>
Run Code Online (Sandbox Code Playgroud)

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

   app:backgroundTint="@color/addedColor"
Run Code Online (Sandbox Code Playgroud)


小智 8

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

app:backgroundTint="@color/blue"
Run Code Online (Sandbox Code Playgroud)

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

android:tint="@color/white"     
Run Code Online (Sandbox Code Playgroud)


Jwa*_*mar 7

对于材料设计,我只是更改了浮动操作按钮的颜色,如下所示,在浮动操作按钮 xml 中添加以下两行。并做了,

 android:backgroundTint="@color/colorPrimaryDark"
 app:borderWidth="0dp"
Run Code Online (Sandbox Code Playgroud)


小智 6

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

fab.getBackground().mutate().setTint(ContextCompat.getColor(yourContext, R.color.anyColor));
Run Code Online (Sandbox Code Playgroud)


Jan*_*lek 5

使用数据绑定时,您可以执行以下操作:

android:backgroundTint="@{item.selected ? @color/selected : @color/unselected}"
Run Code Online (Sandbox Code Playgroud)

了一个非常简单的例子