在 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 是最好的!
这是一些看似经典的代码,我在一个小 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 是最好的!