【问题标题】:How to change background tint of ViewGroup in code?如何在代码中更改 ViewGroup 的背景色?
【发布时间】:2020-04-07 09:50:17
【问题描述】:

我想在我的RecyclerView ViewHolder 中更改ViewGroup 的背景色调,但它一直在抛出NullPointerException

此自定义功能适用于ImageView 和其他Views,但由于某种原因不适用于ViewGroup

private inner class TimeViewHolder(val root: ViewGroup): RecyclerView.ViewHolder(root){
        val minutesTv = root.findText(R.id.minutes)
        val hoursTv = root.findText(R.id.hours)

        fun bind(m: Order.Timeline, onClick: ()->Unit) {
            val a = mainActivity?:return
            with(m) {
                minutesTv.text = "%02d".format(minute)
                if (m.isClosest){
                    root.setBackgroundTint(R.color.highlight)
                } else {
                    root.setBackgroundTint(R.color.white)
                }
            }
        }
    }

fun View.setBackgroundTint(color: Int){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
        this.background.colorFilter = BlendModeColorFilter(ContextCompat.getColor(this.context, color), BlendMode.SRC_IN)
    } else {
        this.background.setColorFilter(ContextCompat.getColor(this.context, color), PorterDuff.Mode.SRC_IN)
    }
}

例外:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.drawable.Drawable.setColorFilter(int, android.graphics.PorterDuff$Mode)' on a null object reference

【问题讨论】:

  • 您是否在某处的ViewGroup 上设置了背景?默认情况下它不会有一个。
  • 不,那会是个问题。
  • 如果你只是想改变视图组的颜色,你可以这样做:viewGroup.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent))

标签: android android-layout kotlin android-recyclerview android-color


【解决方案1】:

我认为你的上下文可以在你的内部 TimeViewHolder 类中为空。您可以从 viewGroup 中获取上下文,该上下文将 root 称为 root.context 并将其传递给您的 setBackgroundTint 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2021-10-17
    • 2017-05-13
    • 1970-01-01
    • 2016-09-11
    • 2021-11-18
    相关资源
    最近更新 更多