Android расширенный Spinner не отвечает на события касания и отсутствующую стрелку - PullRequest
0 голосов
/ 12 июля 2019

Я хочу использовать центрированный счетчик, где ширина счетчика равна ширине выбранного элемента. Из моего исследования кажется, что это не поддерживается изначально из коробки с атрибутом, поэтому я нашел другой вопрос / ответ StackOverflow и попытался реализовать это, но столкнулся с некоторыми проблемами с ним.

Итак, я взял вариант 1 из этого SO ответа и реализовал его в Kotlin, и он не работает для меня

class DynamicWidthSpinner @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatSpinner(context, attrs, defStyleAttr) {

    override fun setAdapter(adapter: SpinnerAdapter?) {
        super.setAdapter(if (adapter != null) WrapperSpinnerAdapter(adapter) else null)
    }

    inner class WrapperSpinnerAdapter(val baseAdapter: SpinnerAdapter) : SpinnerAdapter {

        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
            return baseAdapter.getView(selectedItemPosition, convertView, parent)
        }

        override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
            return baseAdapter.getDropDownView(position, convertView, parent)
        }

        override fun getCount(): Int = baseAdapter.count
        override fun getItem(position: Int): Any = baseAdapter.getItem(position)
        override fun getItemId(position: Int): Long = baseAdapter.getItemId(position)
        override fun getItemViewType(position: Int): Int = baseAdapter.getItemViewType(position)
        override fun getViewTypeCount(): Int = baseAdapter.viewTypeCount
        override fun hasStableIds(): Boolean =  baseAdapter.hasStableIds()
        override fun isEmpty(): Boolean = baseAdapter.isEmpty

        override fun registerDataSetObserver(observer: DataSetObserver) {
            baseAdapter.registerDataSetObserver(observer)
        }

        override fun unregisterDataSetObserver(observer: DataSetObserver) {
            baseAdapter.unregisterDataSetObserver(observer)
        }
    }
}

, и в MainActivity я делаю это из onCreate

        val spinner: DynamicWidthSpinner = findViewById(R.id.global_toolbar_location_spinner)

        val tempLocationList = ArrayList<String>()
        tempLocationList.add("Test1")
        tempLocationList.add("Much longer test string 2")

        spinner.adapter = ArrayAdapter(
            this,
            R.layout.global_toolbar_spinner_item,
            tempLocationList
        )

        spinner.onItemSelectedListener = object : OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, arg3: Long) {
                // TODO: do stuff on selection here
            }

            override fun onNothingSelected(arg0: AdapterView<*>) {
                // TODO: do nothing... yet
            }
        }

        spinner.setSelection(0)

и я использую свой пользовательский Spinner в макете xml (пропуская все остальное, что не нужно, потому что я могу заставить его работать нормально, используя собственный <Spinner> или androidx compat Spinner

<com.blablabla.app.ui.DynamicWidthSpinner
        android:id="@+id/global_toolbar_location_spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:spinnerMode="dialog"
        />

То, что я вижу, это только первый элемент «Test1», и ничего не происходит, когда я нажимаю на него, и стрелка, кажется, теперь тоже исчезла

1 Ответ

0 голосов
/ 12 июля 2019

Я разобрался в проблеме. Оказывается, это один из тех случаев, когда @JvmOverloads не работает. Как только я преобразовал его в синтаксис kotlin с несколькими конструкторами, он работал без проблем


class DynamicWidthSpinner : AppCompatSpinner {

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    ...
}


...