从Appcompat 22.2.0开始,如何以编程的方式更改浮动操作按钮的颜色。

29
我想知道如何从Support库22.2.0更改浮动操作按钮的颜色? 我已经尝试过。
button.setBackgroundColor(color);

但是显然,这会改变按钮的可绘制性并将其变成正方形。

现在我想知道如何只更改颜色而不触及形状?

谢谢提前。


这里是答案 - IgniteCoders
14个回答

41

也许晚了一些,但可能会有帮助。

 fab.setBackgroundTintList(ColorStateList.valueOf(Color
                    .parseColor("#33691E")));

这里的颜色列表中解析实际的颜色代码。


7
补充一点:如果你不想使用硬编码的字符串颜色值,而是引用存储在你的colors.xml文件中的颜色,你可以使用以下代码:fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(getActivity(), R.color.white))); - Shahbaz Sheikh

32
创建一个ColorStateList并将其设置为背景色调:
button.setBackgroundTintList(new ColorStateList(new int[][]{new int[]{0}}, new int[]{color}));

颜色将会动态设置,因此不可能使用XML资源文件。 - user2410644
然后动态创建颜色状态列表? - tachyonflux
根据问题,假设 button 是一个 android.support.design.widget.FloatingActionButton。这意味着它将被限制为 v7。 - tachyonflux
12
或者简单地使用ColorStateList.valueOf(color),来源:https://dev59.com/y10Z5IYBdhLWcg3w3Dfk#32031019 - iceman
1
注意:如果要通过编程方式设置背景颜色,请不要在XML中设置任何与背景颜色相关的属性。刚刚发现XML默认值始终会覆盖来自代码的运行时更改(很奇怪)。 - Marco Miltenburg

13

为了实现向后兼容:

DrawableCompat.setTintList(DrawableCompat.wrap(fab.getDrawable()), tintColor); // <- icon
DrawableCompat.setTintList(DrawableCompat.wrap(fab.getBackground()), backgroundTintColor); // <- background

11
colors.xml中创建一个颜色资源(在此示例中为R.color.purple),并像这样使用它:
floatingActionButton.setBackgroundTintList(getResources().getColorStateList(R.color.purple));

3
请考虑编写解释性文本来搭配你的代码,以帮助未来的读者更好地理解。 - Matt

11

谢谢。这很有帮助。 - pRaNaY

9

方法一:通过xml更改浮动操作栏(fab)颜色:

要更改浮动操作栏(fab)的颜色,请按照以下步骤进行:

只需在浮动操作栏(fab)的xml中添加“app:backgroundTint="#colorcode"”,即可更改其颜色。例如:

app:backgroundTint="#8393ca"

在 #8393ca 的位置添加任何你想要的颜色代码

使用示例:

<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"
    app:backgroundTint="#8393ca"
    android:src="@drawable/send" />

方法2:以编程方式更改悬浮操作栏颜色

只需在您的代码中添加此行

首先,在values => colors中创建红色,然后将此代码添加到您的活动中创建

fab.setBackgroundTintList(getResources().getColorStateList(R.color.red));

                                or

fab.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#33691E")));

来源:http://androidrace.com/2016/12/12/how-to-change-fabfloating-action-bar-color-android/

本文讲述如何在Android应用程序的布局中更改Floating Action Button与Action Bar的颜色。您可以通过调整样式文件中的属性来实现。这篇文章详细介绍了如何使用 Android Studio 来更新样式文件,以及需要更改哪些属性。

这个改变也将文本颜色改为相同的背景颜色。如何避免或更改文本颜色,例如#FFF? - Fernando Torres
我注意到如果你正在使用一个可绘制的图标,这也会将它删除。 - Fernando Torres

6

请在这里查看被接受的答案:Android changing Floating Action Button color

如果您想要改变颜色,则可以采用以下方式:

  • 使用属性app:backgroundTint在XML中
  • 通过.setBackgroundTintList在代码中实现

这仅适用于API级别21以上。 - marienke
@marienke 你确定在 API 21 以下的测试中,xml 中使用了 app 命名空间吗? - Louis CAD
@LouisCAD,你要的来了:http://stackoverflow.com/questions/44108455/android-fab-setbackgroundtintlist-with-colorstatelist-not-working - marienke
@marienke,您只需要在xml中使用ColorStateList,然后在代码中使用setEnabled(isNfcEnabled)来让它使用您的ColorStateList xml文件中的正确颜色。 - Louis CAD
@LouisCAD 是的,那是一种正确的方法,但是这样我就无法监听用户点击NFC FAB并告诉他们去设置中启用设备上的NFC。我只需要改变FAB的颜色,并根据isNfcEnabled布尔值确定从点击处要去哪里。 - marienke
1
@marienke 接下来,查看 CheckedTextView 源代码,使您的 FAB 子类具有您将在 ColorStateList 中使用的 checked 状态。然后,当 NFC 打开或关闭时,您只需通过编程方式更改 FAB 的选中状态,可能使用 setChecked(...) 方法即可。 - Louis CAD

2
尝试使用以下代码。它将为背景资源添加一种色调。
button.setBackgroundTintList(getResources().getColorStateList(R.color.yourColor));

1

1
属性名称为backgroundTint
所以我认为有一个名为的函数。

button.setBackgroundTint(color)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接