From 1fc984709d4fbe26bf153ad4937ee971a3187aaf Mon Sep 17 00:00:00 2001 From: Tiago Pereira Date: Thu, 27 Jun 2019 11:23:24 +0100 Subject: [PATCH] Add support for setting custom drawables programatically. --- .../main/kotlin/com/tiper/MaterialSpinner.kt | 45 +++++++++++-------- .../materialspinner/sample/MainActivity.kt | 2 + .../main/res/drawable/ic_arrow_downward.xml | 9 ++++ 3 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 sample/src/main/res/drawable/ic_arrow_downward.xml diff --git a/materialspinner/src/main/kotlin/com/tiper/MaterialSpinner.kt b/materialspinner/src/main/kotlin/com/tiper/MaterialSpinner.kt index 87c11f8..f2df08d 100644 --- a/materialspinner/src/main/kotlin/com/tiper/MaterialSpinner.kt +++ b/materialspinner/src/main/kotlin/com/tiper/MaterialSpinner.kt @@ -68,6 +68,8 @@ open class MaterialSpinner @JvmOverloads constructor( const val MODE_BOTTOMSHEET = 2 } + private val colorStateList: ColorStateList + /** * The view that will display the available list of choices. */ @@ -191,7 +193,7 @@ open class MaterialSpinner @JvmOverloads constructor( // Create the color state list. //noinspection Recycle - context.obtainStyledAttributes( + colorStateList = context.obtainStyledAttributes( attrs, intArrayOf(R.attr.colorControlActivated, R.attr.colorControlNormal) ).run { @@ -206,23 +208,17 @@ open class MaterialSpinner @JvmOverloads constructor( intArrayOf() ), intArrayOf(activated, activated, normal) ) - }.let { - // Set the arrow and properly tint it. - getContext().getDrawableCompat( + } + // Set the arrow and properly tint it. + getContext().getDrawableCompat( + getResourceId( + R.styleable.MaterialSpinner_android_src, getResourceId( - R.styleable.MaterialSpinner_android_src, - getResourceId( - R.styleable.MaterialSpinner_srcCompat, - R.drawable.ic_spinner_drawable - ) - ), getContext().theme - )?.apply { - DrawableCompat.setTintList(this, it) - DrawableCompat.setTintMode(this, PorterDuff.Mode.SRC_IN) - } - }?.apply { - setBounds(0, 0, intrinsicWidth, intrinsicHeight) - }.also { + R.styleable.MaterialSpinner_srcCompat, + R.drawable.ic_spinner_drawable + ) + ), getContext().theme + ).let { setDrawable(it) } @@ -257,8 +253,19 @@ open class MaterialSpinner @JvmOverloads constructor( } } - private fun setDrawable(d: Drawable?) { - editText.setCompoundDrawablesWithIntrinsicBounds(null, null, d, null) + fun setDrawable(drawable: Drawable?, applyTint: Boolean = true) { + editText.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + drawable?.let { DrawableCompat.wrap(drawable) }?.apply { + setBounds(0, 0, intrinsicWidth, intrinsicHeight) + if (applyTint) { + DrawableCompat.setTintList(this, colorStateList) + DrawableCompat.setTintMode(this, PorterDuff.Mode.SRC_IN) + } + }, + null + ) } override fun setOnClickListener(l: OnClickListener?) { diff --git a/sample/src/main/kotlin/com/tiper/materialspinner/sample/MainActivity.kt b/sample/src/main/kotlin/com/tiper/materialspinner/sample/MainActivity.kt index e459796..fd1440d 100644 --- a/sample/src/main/kotlin/com/tiper/materialspinner/sample/MainActivity.kt +++ b/sample/src/main/kotlin/com/tiper/materialspinner/sample/MainActivity.kt @@ -1,6 +1,7 @@ package com.tiper.materialspinner.sample import android.os.Bundle +import android.support.v4.content.res.ResourcesCompat import android.support.v7.app.AppCompatActivity import android.util.Log import android.view.View @@ -42,6 +43,7 @@ class MainActivity : AppCompatActivity() { adapter = it onItemSelectedListener = listener selection = 3 + setDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_arrow_downward, theme)) } spinner.adapter = it appCompatSpinner.adapter = it diff --git a/sample/src/main/res/drawable/ic_arrow_downward.xml b/sample/src/main/res/drawable/ic_arrow_downward.xml new file mode 100644 index 0000000..dd7522f --- /dev/null +++ b/sample/src/main/res/drawable/ic_arrow_downward.xml @@ -0,0 +1,9 @@ + + +