我有一个自定义视图,其作用类似于按钮。我想在用户按下它时更改背景,当用户将手指移到外面或释放它时将背景恢复为原始状态,我还想处理 onClick/onLongClick 事件。问题是 onTouch 要求我返回 trueACTION_DOWN
否则它不会向我发送ACTION_UP
事件。但如果我返回 trueonClick
听众将无法工作。
我想我通过在 onTouch 中返回 false 并注册 onClick 来解决它 - 它以某种方式起作用,但有点违反文档。我刚刚收到用户的消息,告诉我他无法长按按钮,所以我想知道这里出了什么问题。
当前代码的一部分:
public boolean onTouch(View v, MotionEvent evt)
{
switch (evt.getAction())
{
case MotionEvent.ACTION_DOWN:
{
setSelection(true); // it just change the background
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_OUTSIDE:
{
setSelection(false); // it just change the background
break;
}
}
return false;
}
public void onClick(View v)
{
// some other code here
}
public boolean onLongClick(View view)
{
// just showing a Toast here
return false;
}
// somewhere else in code
setOnTouchListener(this);
setOnClickListener(this);
setOnLongClickListener(this);
我如何让它们正确地协同工作?
提前致谢
onClick
& onLongClick
实际上是从View.onTouchEvent
.
如果你覆盖View.onTouchEvent
或者设置一些具体的View.OnTouchListener
via setOnTouchListener
,
你必须关心这一点。
所以你的代码应该是这样的:
public boolean onTouch(View v, MotionEvent evt)
{
// to dispatch click / long click event,
// you must pass the event to it's default callback View.onTouchEvent
boolean defaultResult = v.onTouchEvent(evt);
switch (evt.getAction())
{
case MotionEvent.ACTION_DOWN:
{
setSelection(true); // just changing the background
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_OUTSIDE:
{
setSelection(false); // just changing the background
break;
}
default:
return defaultResult;
}
// if you reach here, you have consumed the event
return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)