预备棒棒糖设备上的Android setBackgroundTintList

时间:2015-11-10 20:22:19

标签: android floating-action-button setbackground

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

但是,对setBackgroundTintList的推荐调用似乎只与21+ API兼容。

我如何 - 正确 - 在棒棒糖前设备上进行操作?有什么选择我可以使用吗?

提前致谢。

4 个答案:

答案 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)); 当然是fabFloatingActionButton只是一个示例颜色

答案 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_viewxmlns:card_view="http://schemas.android.com/apk/res-auto"