我正在使用FloatingActionButton
。
用户应该能够在onClick
事件中切换FAB背景颜色。
但是,对setBackgroundTintList
的推荐调用似乎只与21+ API兼容。
我如何 - 正确 - 在棒棒糖前设备上进行操作?有什么选择我可以使用吗?
提前致谢。
答案 0 :(得分:31)
您也可以使用setSupportBackgroundTintList
对背景drawable应用色调。不修改当前的色调模式,默认情况下为SRC_IN。
对View.setBackground(Drawable)的后续调用将自动改变drawable并应用指定的色调和色调模式。
另请查看ViewCompat.setBackgroundTintList()
对背景drawable应用色调。
在API v21或更高版本上运行时,这将始终生效。在API v21之前的平台上运行时,只有在View实现TintableBackgroundView接口时才会生效。
我找到了之前使用的解决方案here on 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);
}
}
它适用于我,我希望它也适合你。
答案 1 :(得分:7)
简单:
namespace biginteger_details {
template<typename UInteger>
class UIntegerBase // CRTP base, implementing the arithmetics
{
using uint32_t = std::uint32_t;
using size_t = std::size_t;
// access to data: all functionality is implemented through these methods
uint32_t&block(size_t i) { return static_cast< UInteger*>(this)->m_data[i]; }
uint32_t block(size_t i) const { return static_cast<const UInteger*>(this)->m_data[i]; }
size_t size() const { return static_cast<const UInteger*>(this)->size(); }
void resize(size_t n) { static_cast<UInteger*>(this)->resize(n); }
public:
// assignment operator: allow assignment from any UInteger type
template<typename UI>
UInteger&operator=(UIntegerBase<UI> const&other)
{
resize(other.size());
for(size_t i=0; i!=size(); ++i)
block(i) = other.block(i);
return static_cast<UInteger&>(*this);
}
// add and assign: allow adding any UInteger type
template<typename UI>
UInteger&operator+=(UIntegerBase<UI> const&other)
{
// your code here using block(), size(), and resize()
return static_cast<UInteger&>(*this);
}
};
template<std::size_t nblock=8>
struct UIntegerFP
: UIntegerBase<UIntegerFP<nblock>>
{
static constexpr std::size_t max_blocks=nblock;
// 1 data
std::array<std::uint32_t,nblock> m_data;
std::size_t m_size=0;
// 2 interface to base
std::size_t size() const { return m_size; }
void resize(std::size_t n)
{
if(n>nblock) throw std::out_of_range("exceeding capacity");
m_size = n;
}
// 3 constructors
// copy constructor from any UInteger type
template<typename UI>
UIntegerFP(UIntegerBase<UI> const&other)
{ this->operator=(other); }
};
struct UIntegerAP
: UIntegerBase<UIntegerAP>
{
static constexpr std::size_t max_blocks=~(std::size_t(0));
// 1 data,
std::vector<std::uint32_t> m_data;
// 2 interface to base
std::size_t size() const { return m_data.size(); }
void resize(std::size_t n)
{ m_data.resize(n); }
// 3 constructors
// copy constructor from any UInteger type
template<typename UI>
UIntegerAP(UIntegerBase<UI> const&other)
{ this->operator=(other); }
};
// functions best take UIntegerBase<UI> arguments, for example:
// operator + as stand alone function template
template<typename Ulhs, typename Urhs>
inline std::conditional_t<(Ulhs::max_blocks > Urhs::max_blocks), Ulhs, Urhs>
operator+(UIntegerBase<Ulhs> const&lhs, UIntegerBase<Urhs> const&rhs)
{
std::conditional_t<(Ulhs::max_blocks > Urhs::max_blocks), Ulhs, Urhs>
result=lhs;
return result+=rhs;
}
} // namespace biginteger_details;
using biginteger_details::UIntegerFP;
using biginteger_details::UIntegerAP;
// note: biginteger_details::operator+ will be found by ADL (argument dependent look-up)
fab.setBackgroundTintList(ColorStateList.valueOf(0xFF4CAF50));
当然是fab
,FloatingActionButton
只是一个示例颜色
答案 2 :(得分:0)
正如Kamil Seweryn在评论中所说,我可以确认fab.setBackgroundTintList()
适用于android.support.design.widget.FloatingActionButton
的实例。
我在三星Galaxy s5(android 6)和三星Galaxy s3(android 4.3)上测试过。两者都正常工作。
答案 3 :(得分:0)
您可以使用XML
card_view:backgroundTint="@color/your_color"
其中card_view
是xmlns:card_view="http://schemas.android.com/apk/res-auto"