Search code examples
androidseekbartint

Seekbar - tint color changing for all instances of view


I have a Seekbar:

    <SeekBar
        android:id="@+id/sw_lock"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="60dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="60dp"
        android:max="100"
        android:thumb="@drawable/ic_thumb"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/lbl_device_status" />

Im using databinding and all is working fine. The problem comes when i want to change the thumb color.

In a fragment, i have a vertical linear layout containing 0...n views which contains this seekbar

response.observe(viewLifecycleOwner, Observer { list ->

    activity?.run {

        list.forEach { element ->

            val mView = MyView(this)
            mView.layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
            )
            mView.bind(element)
            mView.didUnlock = { view, unlocked, element ->

                //DO STUFF
            }

            binding.container.addView(mView)
        }
    }
})

This is working fine. I have n instances and each instance works properly.

Now, i want to change the thumb color when the progress change so i have:

override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {

    changeColor(binding.swLock.progress > 80)
}

and changeColor method is just like this:

private fun changeColor(active: Boolean) {

    val color = if(active) {

        R.color.colorAccent
    } else {

        R.color.text_main
    }

    binding.swLock.progressDrawable.setTint(getColor(color))
    binding.swLock.thumb.setTint(getColor(color))
}

And here comes the weird thing, the progressDrawable changes in each instance, the thumb changes for all instances. What am i doing wrong?

Thanks and regards


Solution

  • it seems that adding tint to the drawable is modifying all the instances of that drawable (if it makes any sense), so i added also the "active" drawable and changed the changeColor function to

    private fun changeColor(active: Boolean) {
    
        val thumb = if(active) {
    
            R.drawable.ic_thumb_active
        } else {
    
            R.drawable.ic_thumb
        }
        val color = if(active) {
    
            R.color.colorAccent
        } else {
    
            R.color.text_main
        }
    
        binding.swLock.progressDrawable.setTint(getColor(color))
        binding.swLock.thumb = resources.getDrawable(thumb, null)
    }
    

    i just have to make this cleaner but its working now