目标:我有一个自定义按钮,其中包含我想要保留的功能onTouch,但在其上添加了功能。
问题:像这样添加onTouch会覆盖原始的自定义按钮功能,从而不再执行原始所需的行为。有注释" @Override"或不改变任何事情:
myButton.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
MainActivity.super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//Extra behavior needed
return true;
}
return false;
}
});
自定义按钮本身:
public class CustomButton extends Button implements View.OnTouchListener {
...
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
//Original needed behavior. Need to keep.
break;
...
}
return false;
}
...
}
任何人都可以研究的解决方案?谢谢!
答案 0 :(得分:2)
您需要在CustomButton类中调用public方法
myButton.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
//try adding this line
boolean touchResult = myButton.onTouch(v, event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//Extra behavior needed
return true;
}
return (false||touchResult);
}
});
添加触摸结果变量可确保您在两个位置处理触摸。
答案 1 :(得分:1)
如果您已经有自定义Button实现(CustomButton
),则可能需要覆盖其setOnTouchListener
方法,如下所示:
@Override
public void setOnTouchListener(final OnTouchListener l) {
OnTouchListener wrapperListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean myButtonTouchListenerResult = CustomButton.this.onTouch(v, event);
boolean wrappedTouchListenerResult = l.onTouch(v, event);
return myButtonTouchListenerResult || wrappedTouchListenerResult;
}
}
super.setOnTouchListener(wrapperListener);
}
当来自外部的人分配另一个实例时,这将确保原始onTouchListener
保留。