Android扩展Spinner无法响应点击事件和缺少箭头 [英] Android extended Spinner is not responding to tap events and missing arrow

查看:589
本文介绍了Android扩展Spinner无法响应点击事件和缺少箭头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用居中的微调器,其中微调器的宽度仅与所选项目文本一样宽.从我的研究来看,似乎没有使用属性直接支持该功能,因此我找到了另一个StackOverflow问题/答案,并尝试实现该问题/答案,但遇到了一些问题.

I want to use a centered spinner where the width of the spinner is only as wide as the selected item text. From my research it seems that this is not natively supported out of the box with an attribute so I found another StackOverflow question/answer and tried implementing that but ran into some issues with it.

所以我从此SO响应中选择了选项1,并在Kotlin中实现了它,但对我不起作用

So I took option 1 from this SO response and implemented it in Kotlin and It's not working for me

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进行的

and in my MainActivity I'm doing this from 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)

并且我在布局xml中使用了我的自定义Spinner(省略了不必要的所有其他操作,因为我可以使用本机<Spinner>或androidx compat Spinner使其正常工作

and I am using my custom Spinner in the layout xml (ommitting everything else that is not necessary because I am able to get it work just fine using the native <Spinner> or 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",当我点击它时,什么也没有发生,箭头现在似乎也消失了

What I see is just the first item "Test1" and nothing happens when I tap on it and arrow seems to have disappeared now as well

推荐答案

我发现了问题所在.原来,这是@JvmOverloads不起作用的情况之一.一旦将其转换为多构造函数kotlin语法,它就可以毫无问题地工作

I figured out the issue. Turns out that this is one of those cases where the @JvmOverloads doesn't work. Once I converted it to the multiple constructor kotlin syntax it worked without a problem


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)

    ...
}


这篇关于Android扩展Spinner无法响应点击事件和缺少箭头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆