Сделать подсказку для Android Spinner, используя перечисления - PullRequest
0 голосов
/ 11 июня 2019

Я не могу найти решение своей проблемы: я хочу, чтобы текст подсказки отображался на моем Spinner, но адаптер, который я установил, принимает только тип enum (IdentityType enum), поэтому я не могу добавить в него строку (для подсказки)

Есть ли у вас какое-либо решение, все еще использующее enum в адаптере?

private fun initDriverIdentityTypeSpinner() {
    driverIdentityTypeSpinner.adapter = object : ArrayAdapter<IdentityType>(context!!, android.R.layout.simple_spinner_item,IdentityType.values()) {
        override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View =
            (super.getDropDownView(position, convertView, parent) as CheckedTextView).also{
                it.setText(getItem(position)!!.stringRes())
            }
        override fun getView(position: Int, convertView: View?, parent: ViewGroup) =
            (super.getView(position, convertView, parent) as TextView).also {
                it.setText(getItem(position)!!.stringRes())
            }

        override fun isEnabled(position: Int): Boolean = position != 0

    }.also {
        it.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    }
}

//IdentityType Extension
@StringRes
fun IdentityType.stringRes(): Int {
    return when(this) {
        IdentityType.DRIVING_LICENSE -> R.string.driving_license
        IdentityType.ID_CARD -> R.string.id_card
        IdentityType.PASSPORT -> R.string.passport
    }
}

1 Ответ

0 голосов
/ 11 июня 2019

В Kotlin есть возможность поместить свойства в enum (здесь он называется enum class).Вы можете определить его в конструкторе следующим образом:

enum class IdentityType(val stringResId: Int) {
    DRIVING_LICENSE(R.string.driving_license),
    ID_CARD(R.string.id_card),
    PASSPORT(R.string.passport)
}

Затем вы можете использовать его так, как будто это общее свойство класса.

val type: IdentityType = ...
val string = getString(type.stringResId)
...