Реакция на повторное нажатие (повторный выбор) элемента Spinner, когда он уже выбран
Использую стандартный Spinner (Android Studio, Kotlin, android.widget). Нужна реакция на повторное нажатие элемента Spinner, после того как этот элемент уже был выбран. Я не нашёл стандартных способов как это сделать. Вот мой код:
binding.alarmRepeatingModeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
// Вызывается при выборе любого элемента Spinner (кроме уже выбранного)
override fun onItemSelected(
parentView: AdapterView<*>?,
selectedItemView: View?,
position: Int,
id: Long
) {
val selectedValue = parentView?.getItemAtPosition(position).toString()
if(selectedValue != "Select days") {
hideWeekDaysAbbreviatedText()
}
else {
//Реакция на нажатие на элемент "Select days".
//Если значение спиннера уже установлено на "Select days", то повторное нажатие ничего не делает.
//А мне нужно, чтобы срабатывало. Помогите!
showWeekDaysChoosingPopup()
}
}
//Вызывается если ничего не выбрано (не используется)
override fun onNothingSelected(parentView: AdapterView<*>?) { }
}
Ответы (1 шт):
На англоязычном StackOverflow уже отвечали на этот вопрос 3 года назад: https://stackoverflow.com/questions/64550613/spinner-already-selected-item-selection-event
Думаю, что стандартного решения нет. Но вот как оно делается (у меня всё заработало):
- Создаём класс расширяющий
Spinner
class MySpinner(context: Context, attrs: AttributeSet?) : androidx.appcompat.widget.AppCompatSpinner(
context,
attrs
)
{
var listener: OnItemSelectedListener? = null
override fun setSelection(position: Int)
{
super.setSelection(position)
if (position == selectedItemPosition)
{
listener!!.onItemSelected(this, selectedView, position, selectedItemId)
}
}
override fun setOnItemSelectedListener(listener: OnItemSelectedListener?)
{
this.listener = listener
}
}
Добавляем ссылку на него в Layout (заменяем спиннер на свой). Вместо
com.example.passwordalarmclock.MySpinnerвставляем ссылку на классMySpinner(ПКМ по классу -> copy reference)<com.example.passwordalarmclock.MySpinner android:id="@+id/alarmRepeatingModeSpinner" android:layout_width="336dp" android:layout_height="75dp" />Всё остальное оставляем как есть (всё стандартно), в том числе логику. В итоге просто
onItemSelectedначнёт срабатывать даже при повторном выборе.
Если кто знает решение, которое ещё проще, можете поделиться. Спасибо за внимание.