Android:添加setOnTouchListener而不覆盖现有的吗?

Android:添加setOnTouchListener而不覆盖现有的吗?,android,Android,目标:我有一个自定义按钮,它已经包含了我想保留的功能,但在上面添加了功能 问题:添加类似so的onTouch会覆盖原始自定义按钮功能,因此不再执行原始需要的行为。是否具有批注“@Override”不会改变任何内容: myButton.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { MainA

目标:我有一个自定义按钮,它已经包含了我想保留的功能,但在上面添加了功能

问题:添加类似so的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;
    }
    ...
}

有什么可以研究的解决方案吗?谢谢大家!

您需要在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会想出什么:-)我个人认为这不应该像预期的那样工作。