I know it's too late but finally, I found a solution without extending the Spinner.
Just create a selector drawable like given below and set it as the background of spinner like android:background="@drawable/bg_spinner"
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<layer-list>
<item android:drawable="@drawable/ic_up_arrow" android:gravity="center_vertical|right" android:right="5dp" />
</layer-list>
</item>
<item>
<layer-list>
<item android:drawable="@drawable/ic_down_arrow" android:gravity="center_vertical|right" android:right="5dp" />
</layer-list>
</item>
</selector>
And a Kotlin Extention function as...
fun AppCompatSpinner.setSpinnerFocusable() {
isFocusableInTouchMode = true
onFocusChangeListener = View.OnFocusChangeListener { v, hasFocus ->
if (hasFocus) {
if (windowToken != null) {
performClick()
viewTreeObserver?.addOnWindowFocusChangeListener(object :
ViewTreeObserver.OnWindowFocusChangeListener {
override fun onWindowFocusChanged(hasFocus: Boolean) {
if (hasFocus) {
clearFocus()
viewTreeObserver?.removeOnWindowFocusChangeListener(this)
}
}
})
}
}
}
}
and from your activity/fragment call the extension method like spUser.setSpinnerFocusable()
That's it, no need to extend the Spinner class or use any library.