Null pointer Exception: GestureDetector.onTouchEve

2019-05-11 02:11发布

问题:

In one of my android app, I am using custom gallery to show images in gallery . (I am using custom gallery in order to show 1 item a time when swapping the gallery)

Here is the code that I am using for custom gallery :

public class CustomGallery extends Gallery {

     public CustomGallery(Context context) {
            super(context); 
        }

        public CustomGallery(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public CustomGallery(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

    private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
        return e2.getX() > e1.getX();
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        int kEvent;
        if (isScrollingLeft(e1, e2)) { // Check if scrolling left
            kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
        } else { // Otherwise scrolling right
            kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
        }
        onKeyDown(kEvent, null);
        return true;

    }
}

The above code is working fine 2.2,2.3 etc.... but its crashing in ICS 4.0 causing Null pointer Exception GestureDetector.onTouchEvent .

Please help .

Thanks in Advance.

回答1:

I had this same sporadic problem. The two MotionEvent parameters that is passed to the override onFling method are sometimes null and calling e2.getX() throws the exception. You can fix this by starting your onFling method like this:

if (e1 == null || e2 == null) return false;


回答2:

I had the same problem only happening on ICS4.0 - my Gallery View was opening an Activity within the TabHost when user clicks an item on the Gallery - it was always giving NullPointerException but only on ICS4 - I ended up doing the following which did the trick:

//flag returned by onTouch event always false except when we are about to start activity
boolean flag = false;
//add a touch listener
myGallery.setOnTouchListener(new OnTouchListener() {
@Override
    public boolean onTouch(View v, MotionEvent event) {
        return flag;
    }
});

myGallery.setOnItemClickListener(new OnItemClickListener() {
    //handle clicks

    //set flag returned by touch listener to true
    flag = true;

    //now add logic to open up the activity
 }

The Exception has now gone on ICS4.