Method onTouchEvent not being called Method onTouchEvent not being called android android

Method onTouchEvent not being called


I found a perfect solution. I implemented new method:

@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {    View v = getCurrentFocus();    boolean ret = super.dispatchTouchEvent(event);

and now it all works fine!

Edit:

My final code:

@Overridepublic 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;}


As I wrote in Gabrjan's post's comments that this fires continuously while touching the screen, there's actually an easy way to get only the touch down events:

@Overridepublic 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);} 

This was very useful to me to put the Android into immersive mode whenever any part of the screen was touched regardless which element. But I didn't wish to set immersive mode repeatedly!


ok, now i'm sure that the problem is that scrollview handle touches, so anyway to ignore that and yet be the scrolling avaiable?

Yes that's the problem, when android handles touch events each event goes from child to parent, so first it's handled by ViewFlipper, but then it goes to ScrollView. So you have to implement getParent().requestDisallowInterceptTouchEvent(true) (see ViewParent class) in order to make all touch events handled by ViewFlipper, and then simply detect the direction of gesture if horizontal then flip view if not then pass touch event to ScrollView or just scroll ScrollView programmatically

EDIT: Also you can implement OnTouchListener in your ViewFlipper and in this listener trigger GestureDetector.onTouchEvent(event), but this also requires requestDisallowInterceptTouchEvent of your parent view set to true