0

我有一个扩展 EditText 并覆盖 onTouchEvent() 方法的类,以便查看相应的 MotionEvents 何时发生:

public class CustomEditText extends EditText {
    public CustomEditText(Context context) {
        super(context);
    }
    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public CustomEditText(Context context, AttributeSet attrs, int i) {
        super(context, attrs, i);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN: Log.v("ME", "down");
        break;
        case MotionEvent.ACTION_UP: Log.v("ME", "up");
        break;
        case MotionEvent.ACTION_MOVE: Log.v("ME", "move");
        break;
        case MotionEvent.ACTION_CANCEL: Log.v("ME", "cancel");
        break;
        }
        return true;
    }
}

当视图不在 aScrollView中时,一切都按预期工作:只要我的手指在屏幕上移动,LogCat 就会打印“移动”。但是,当视图在 a 内ScrollView并且我垂直移动手指时,LogCat 会打印一些“移动”,在几毫米后“取消”,然后什么都没有,直到我将手指放在屏幕上。当我水平移动时不会发生这种情况。

我认为原因是此时ScrollView认识到它应该现在开始滚动并因此从视图中“窃取” MotionEvents 以便自行评估它们。

我现在的问题是:如何在不创建新类扩展的情况下禁止这种行为ScrollView

感谢你在期待

丹尼尔·R。

4

2 回答 2

2

你为什么不尝试setOnTouchListener

前任:

ScrollView yourScrollView;
yourScrollView.setOnTouchListener(new View.OnTouchListener(){
    public boolean  onTouch  (View v, MotionEvent event){
        yourTextView.onTouch(yourTextView,event);
    }
});

这些行中的某些内容..请回来报告,以便我可以将答案编辑为最佳

于 2011-08-07T23:36:09.900 回答
0

(是我,DanielR。我现在有了自己的帐户,对此感到抱歉。)

非常感谢您的快速回答,谢里夫。这解决了我的问题。
我在我的应用程序中实际执行的是查看EditText具有 3 个区域的可滚动项:左侧和右侧的小边距,您可以在其中滚动视图,以及中心的主要区域,在其中执行常见的编辑操作。为了实现这一点,我正在做的是:
1. 当用户在边缘开始一个手势时,我将 onTouchListener 设置为null,因此ScrollView执行了 的滚动动作(在此处某处的帖子中阅读)。
2. 触摸主区域,onTouchListener 设置为您上面建议的那个,所以滚动被禁用并且所有触摸事件都到达 EditText。以前,我的 onTouchListener 是空的,所以只禁止滚动。我不知道为什么我自己没有看到。我认为为时已晚;)

再次,非常感谢。

于 2011-08-08T00:21:39.020 回答