在 Kotlin 中同时处理按钮点击和按钮触摸

Handling button click and button touch simultaneously in Kotlin

这是一些看似经典的代码,我在一个小 android 应用程序中。 它正在处理一些按钮,所以没什么特别的;但问题是:

只要我选择拥有两个功能块之一,这段代码就可以工作 theBtn.setOnClickListener {..}theBtn.setOnTouchListener {..}.

但如果我想同时拥有两者,它就不再有效了。我错过了什么吗?

    val greyLvl = 0x89
    val stdColor = Color.rgb(greyLvl,greyLvl,greyLvl)
    val hiLiColor = Color.rgb(0x33,0x66,0x88)

    val theBtn = Button(this)
    theBtn.setTextColor(stdColor)
    theBtn.setBackgroundColor(0x00)
    theBtn.setTextSize(TypedValue.COMPLEX_UNIT_PX, 31.dpToPixels(this))
    theBtn.setTypeface(null, Typeface.BOLD)
    theBtn.text = "THE BUTTON"


    theBtn.setOnClickListener {
        // Handling the button action.
        println("-- theBtn.setOnClickListener --")
    }


    theBtn.setOnTouchListener { view, motionEvent ->
        // Controlling the button color.
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
            theBtn.setTextColor(hiLiColor)
        } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
            theBtn.setTextColor(stdColor)
        }

        return@setOnTouchListener true;
    }


    scrolVwLayOut.addView(theBtn)

您似乎为两个不同的听众重复使用了同一个按钮。我不太有经验,但你如何让它同时执行两个不同的动作?也许使用 when 语句进行运动,然后调用触摸侦听器,否则使用 onClick?抱歉,如果那不起作用。请让我知道!也很好奇:)

因为onTouch和onClick会冲突,当你消费onTouchListener中的事件时,即 return@setOnTouchListener true;不会再执行点击,如果你想让点击事件在ACTION_UP之后执行,只是 return@setOnTouchListener false

就像 Selvin 说的,如果你只是想在按下时改变按钮的颜色或背景,你不应该这样做,使用 drawable selector 是最好的!