I’ve Googled a lot but I still didn’t find any solution for my problem. I’m new to Android so sorry for a stupid question. Here is my code:
final Intent myIntent = new Intent(this.getBaseContext(), ShowActivity.class); webView.setOnTouchListener(new SwipeListener(this) { @Override public void onSwipeLeft() { articleID--; //System.out.println("SWIPE_LEFT"); myIntent.putExtra("id", articleID); System.out.println(myIntent.toString()); Swiped = true; } @Override public void onSwipeRight() { articleID++; //System.out.println("SWIPE_RIGHT"); myIntent.putExtra("id", articleID); System.out.println(myIntent.toString()); Swiped = true; } }); if (Swiped == true) mContext.startActivity(myIntent);
So, the question is: why my new activity doesn’t start? I mean it doesn’t even get into if-condition. Seems like that because of listener it ignores any code below, doesn’t it? How to exit from listener? Btw, i’m trying to start new activity on Swipe. Maybe I need to rework architecture? But i really don’t want to =(
This is my SwipeListener class:
public class SwipeListener implements View.OnTouchListener { // Gesture Detector which has onTouchEvent action // Gesture detector requires custom gesture listener (Which declared below) private GestureDetector gestureDetector; // Basic Construction public SwipeListener(Context c) { gestureDetector = new GestureDetector(c, new GestureListener()); } // onTouch action. Returns ANY (click and release) event thanks to onTouchEvent of gestureDetector public boolean onTouch(final View view, final MotionEvent motionEvent) { return gestureDetector.onTouchEvent(motionEvent); } // GestureListener for GestureDetector declaration. private final class GestureListener extends GestureDetector.SimpleOnGestureListener { private static final int SWIPE_MIN_DISTANCE = 100; // Swipe minimal distance private static final int SWIPE_MIN_VELOCITY = 100; // swipe minimal speed @Override public boolean onDown(MotionEvent e) { return true; } // Determines the fling velocity and then fires the appropriate swipe event accordingly // onFling MUST return false so don't touch it. @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { float diffY = e2.getY() - e1.getY(); // Y(vertical) Difference between release and press coordinates float diffX = e2.getX() - e1.getX(); // X(horizontal) Difference between release and press coordinates // Determine if swipe was in horizontal or in vertical align // Horizontal (left-right) if (Math.abs(diffX) > Math.abs(diffY)) { // Check if speed and distance are big enough if (Math.abs(diffX) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_MIN_VELOCITY) { if (diffX > 0) { onSwipeRight(); } else { onSwipeLeft(); } } // Vertical (up-down) } else { if (Math.abs(diffY) > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_MIN_VELOCITY) { if (diffY > 0) { onSwipeDown(); } else { onSwipeUp(); } } } } catch (Exception exception) { System.out.println("YOU SHALL NOT SWIPE"); } return false; } } public void onSwipeRight() { // U need to override this } public void onSwipeLeft() { // and this } public void onSwipeUp() { // and this one too } public void onSwipeDown() { // U know what to do }
}
Here is a log:
01-09 19:21:36.564 7758-7758/com.weel.ur W/System.err﹕ java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.Intent.getFlags()' on a null object reference 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.app.ContextImpl.startActivity(ContextImpl.java:1231) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.app.ContextImpl.startActivity(ContextImpl.java:1219) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at com.weel.ur.ShowActivity.startAct(ShowActivity.java:755) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at com.weel.ur.ShowActivity$2.onSwipeLeft(ShowActivity.java:347) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at com.weel.ur.calligraphy.SwipeListener$GestureListener.onFling(SwipeListener.java:51) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.GestureDetector.onTouchEvent(GestureDetector.java:610) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at com.weel.ur.calligraphy.SwipeListener.onTouch(SwipeListener.java:22) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.View.dispatchTouchEvent(View.java:8382) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2424) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2158) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2172) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2314) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1692) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.app.Activity.dispatchTouchEvent(Activity.java:2739) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchTouchEvent(ActionBarActivityDelegateICS.java:268) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2275) 01-09 19:21:36.565 7758-7758/com.weel.ur W/System.err﹕ at android.view.View.dispatchPointerEvent(View.java:8578) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4021) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3887) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3468) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3476) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3449) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5701) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5675) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5646) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5791) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.os.MessageQueue.nativePollOnce(Native Method) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.os.MessageQueue.next(MessageQueue.java:143) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.os.Looper.loop(Looper.java:122) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5221) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method) 01-09 19:21:36.566 7758-7758/com.weel.ur W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372) 01-09 19:21:36.567 7758-7758/com.weel.ur W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 01-09 19:21:36.567 7758-7758/com.weel.ur W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Answer
You must have set default value for Swiped
to false. Because you are starting activity outside of the listener its is called even before you get a chance to touch the screen. When onTouchListener
is called value of Swiped
is changed but you are not starting the activity.
webView.setOnTouchListener(new SwipeListener(this) { @Override public void onSwipeLeft() { articleID--; //System.out.println("SWIPE_LEFT"); Intent myIntent = new Intent(ShowActivity.this, ShowActivity.class); myIntent.putExtra("id", articleID); System.out.println(myIntent.toString()); ShowActivity.this.startActivity(myIntent); } @Override public void onSwipeRight() { articleID++; //System.out.println("SWIPE_RIGHT"); Intent myIntent = new Intent(ShowActivity.this, ShowActivity.class); myIntent.putExtra("id", articleID); System.out.println(myIntent.toString()); Swiped = true; ShowActivity.this.startActivity(myIntent); } });
Also, you might want to add a condition before articleID--
and articleID++
. This will help you when you reach to first and last article in the queue. If so Swiped
should be set to false or you can reset the articleID