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

时间:2017-03-14 14:37:45

标签: android

目标:我有一个自定义按钮,其中包含我想要保留的功能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;
    }
    ...
}

任何人都可以研究的解决方案?谢谢!

2 个答案:

答案 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保留。