Android setBackgroundTintList 在低于 Lollipop 版本的设备上

19

我正在使用 FloatingActionButton。用户应该能够在onClick事件中切换FAB背景颜色。

然而,推荐使用的setBackgroundTintList方法似乎只兼容21+ API。

在早期版本的设备上,我应该如何正确地处理它?是否有任何替代方法可供使用?

提前致谢。


1
尝试这个答案 - Skizo-ozᴉʞS ツ
@Skizo 谢谢!我不知道那个 ViewCompat 调用(也不知道 setSupportBackgroundTintList)。请写下你自己的答案,这样我就可以标记它为已接受的答案! - Lampione
请查看这个答案 - Amit Vaghela
3个回答

34

你也可以使用setSupportBackgroundTintList方法来为背景可绘制对象着色。不会更改当前的着色模式,默认情况下为SRC_IN。

后续调用View.setBackground(Drawable)将自动变异可绘制对象并应用指定的着色和着色模式。

还要查看ViewCompat.setBackgroundTintList()方法。

这将对背景可绘制对象进行着色。

当在API v21或更新版本上运行时,此操作始终生效。在早于API v21的平台上运行时,只有视图实现了TintableBackgroundView接口才会生效。

我在SO上找到了一个解决方案(链接),我以前使用过它:

public static void setButtonTint(Button button, ColorStateList tint) {
  if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP && button instanceof AppCompatButton) {
      ((AppCompatButton) button).setSupportBackgroundTintList(tint);
  } else {
      ViewCompat.setBackgroundTintList(button, tint);
  }
}

它对我有效,希望它对你也有效。


太棒了!正是我正在寻找的!谢谢您。 - Lampione
1
但是FloatingActionButton没有实现TintableBackgroundView,因此ViewCompat.setBackgroundTintList()在API < 21上不起作用。 - lage
2
当我使用AppCompatButton.setBackgroundTintList()时,我会收到一个Lint警告。只能在同一库组(groupId=com.android.support)内调用AppCompatButton.setSupportBackgroundTintList。 - starkej2
@starkej2,您能否发布一个带有与您的问题相关的图像的问题,并在此处链接您的问题链接吗?我会尽力帮助您:D - Skizo-ozᴉʞS ツ
@Skizo-ozᴉʞS 我认为你只需要调用ViewCompat.setBackgroundTintList(button, tint),而不必考虑API级别。 - starkej2
显示剩余2条评论

10

简单:

fab.setBackgroundTintList(ColorStateList.valueOf(0xFF4CAF50));

fab 是您的 FloatingActionButton,而 0xFF4CAF50 只是一个示例颜色。


我觉得你没有理解我的意思。请查看@Skizo的答案以获得进一步的澄清。顺便说一句,谢谢! :) - Lampione
这种方式向后兼容吗? - Basheer AL-MOMANI
1
@Matteo FAB的实现来自支持库,它支持向后兼容。在setBackgroundTintList()下面,使用了不同的实现来支持早期版本。在KitKat设备上已经验证过。 - Kamil Seweryn

0

从 XML 中,您可以使用

card_view:backgroundTint="@color/your_color"

其中 card_viewxmlns:card_view="http://schemas.android.com/apk/res-auto"


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