Android 未调用onTouchEvent方法

Android 未调用onTouchEvent方法,android,swipe,touch-event,Android,Swipe,Touch Event,我的方法有问题 @Override public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } 从来没有人打过电话。你知道为什么吗?我正在构建一个google的API 4.0.3应用程序,并尝试为我的ViewFlipper启用滑动。然而,它无法工作,因为触摸从未被调用 代码: public class MainActivity extends Sherlo

我的方法有问题

@Override
public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}
从来没有人打过电话。你知道为什么吗?我正在构建一个google的API 4.0.3应用程序,并尝试为我的ViewFlipper启用滑动。然而,它无法工作,因为触摸从未被调用

代码:

 public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener {
这就是我的活动宣言。为了检测刷卡,我实施了以下措施:

    SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {

        float sensitvity = 50;
        if((e1.getX() - e2.getX()) > sensitvity){
            SwipeLeft();
        }else if((e2.getX() - e1.getX()) > sensitvity){
            SwipeRight();
        }

        return true;
    }

};
GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener);
多谢各位

编辑:

main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<ViewFlipper
    android:id="@+id/ViewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff" >

    <include
        android:layout_height="match_parent"
        layout="@layout/mymain" />

    <include layout="@layout/secondmain" />
    <include layout="@layout/thirdmain" />
    <include layout="@layout/fourthmain" />
</ViewFlipper>
</LinearLayout>


Edit2:我所有包含的布局都实现了scrollview。scroll是否可能接收并处理这些事件?如果是,如何检测手势?

所有手势和触摸事件都会转到视图层次结构中能够处理它的最低元素。 因此,如果在包含的布局中有任何侦听器,则可以调用
((TypeOfParent)yourView.getParent()).onTouchEvent(事件)
将事件委托给所需的处理程序

添加:我建议您使用
ViewPager
来翻转视图。 在ViewPager中,您不需要实现自己的OnTestureListener


好的,现在我确定问题是scrollview句柄接触,所以不管怎样,忽略它,仍然可以使用滚动

是的,这就是问题所在,当android处理触摸事件时,每个事件都会从一个子节点传递到另一个子节点,所以首先由ViewFlipper处理,然后再转到ScrollView。因此,您必须实现getParent().RequestDisallowWinterCeptOuchEvent(true)(请参阅),以便让ViewFlipper处理所有触摸事件,然后简单地检测手势的方向(如果是水平的),然后翻转视图(如果不是),然后将触摸事件传递给ScrollView,或者以编程方式滚动ScrollView


编辑:您还可以在ViewFlipper中实现OnTouchListener,并在此listener中触发GestureDetector.onTouchEvent(事件),但这也需要将父视图的RequestDisallowWinterCeptTouchEvent设置为true,我找到了一个完美的解决方案。我实施了新方法:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);
现在一切都好了

编辑:

我的最终代码:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    View v = getCurrentFocus();
    if (v instanceof EditText) {
        View w = getCurrentFocus();
        int scrcoords[] = new int[2];
        w.getLocationOnScreen(scrcoords);
        float x = event.getRawX() + w.getLeft() - scrcoords[0];
        float y = event.getRawY() + w.getTop() - scrcoords[1];
        if (event.getAction() == MotionEvent.ACTION_UP
                && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w
                        .getBottom())) {

            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getWindow().getCurrentFocus()
                    .getWindowToken(), 0);
        }
    }
    boolean ret = super.dispatchTouchEvent(event);
    return ret;
}
@覆盖
公共布尔dispatchTouchEvent(MotionEvent){
视图v=getCurrentFocus();
if(v instanceof EditText){
视图w=getCurrentFocus();
int scrcoords[]=新int[2];
w、 getLocationOnScreen(scrcoords);
float x=event.getRawX()+w.getLeft()-scrcoords[0];
float y=event.getRawY()+w.getTop()-scrcoords[1];
如果(event.getAction()==MotionEvent.ACTION\u UP
&&(x=w.getRight()| | yw
.getBottom()){
InputMethodManager imm=(InputMethodManager)getSystemService(Context.INPUT\u方法\u服务);
imm.hideSoftInputFromWindow(getWindow().getCurrentFocus())
.getWindowToken(),0);
}
}
布尔ret=super.dispatchTouchEvent(事件);
返回ret;
}

正如我在Gabrjan的帖子评论中所说,触摸屏幕时会持续触发,实际上有一种简单的方法可以只获取触地事件:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        System.out.println("TOUCH DOWN!");
        //set immersive mode here, or whatever...
    }
    return super.dispatchTouchEvent(event);
} 

无论何时触摸屏幕的任何部分,无论是哪一个元素,这对我来说都是非常有用的。但我不想反复设置沉浸式模式

好的,现在我确定问题是scrollview句柄会接触,所以不管怎样,忽略它,仍然可以使用滚动?谢谢,这是一个比@Chaosit.Hi更简单的解决方案-你在哪里实现了这个新方法?它返回什么?检查编辑的答案。我在MainActivity.java文件中实现了该函数。或者更好地说是在应用程序的主类中。我在webview中使用onTouchEvent,似乎随着我的WV变得越来越复杂,onTouchEvent方法变得越来越不稳定。dispatchTouchEvent可以很好地保证触摸被检测到,但会消耗cpu,因为它在按住时会持续激发(我认为onTouchEvent不会持续激发)。