Android:添加setOnTouchListener而不覆盖现有的吗?
目标:我有一个自定义按钮,它已经包含了我想保留的功能,但在上面添加了功能 问题:添加类似so的onTouch会覆盖原始自定义按钮功能,因此不再执行原始需要的行为。是否具有批注“@Override”不会改变任何内容:Android:添加setOnTouchListener而不覆盖现有的吗?,android,Android,目标:我有一个自定义按钮,它已经包含了我想保留的功能,但在上面添加了功能 问题:添加类似so的onTouch会覆盖原始自定义按钮功能,因此不再执行原始需要的行为。是否具有批注“@Override”不会改变任何内容: myButton.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { MainA
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;
}
...
}
有什么可以研究的解决方案吗?谢谢大家! 您需要在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);
}
});
添加touch result变量可确保在两个位置处理触摸。如果您已经有自定义按钮实现(
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
仍然保留。重写将只检查该方法在超类中是否可用如果我没有弄错,这将导致StackOverFlowException
,因为您正在调用myButton.onTouch()
在touch listener中,这将导致无休止地再次调用该回调。我不确定其行为,我猜这里有两个独立的触摸项。试试这段代码,还有一个解决方案,我必须进行交叉检查,尽管我认为您只是在一个函数中调用同一个函数(递归)。请参见,您处于CustomButton
类的onTouch()
函数中。您正在从它调用onTouch()
函数。为什么它不会导致无休止的递归呢?是的,这段代码应该可以工作,当您将touch listener添加到视图时,以前的touch listener将被新的替换,因此,您可以使用新的触控监听器调用上一个触控监听器,而无需循环。让我们看看@StackpWrequirementsRecrazy会想出什么:-)我个人认为这不应该像预期的那样工作。