Reputation: 423
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)
Upvotes: 0
Views: 1470
Reputation: 18112
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
Upvotes: 1
Reputation: 578
You have confused the flow of your program. Setting a listener does not pause the program, and ending an in-listener method does not return to the method that created the listener. When you set a listener, you only set the listener, without running it. And then your program moves on.
This is what your program is dong:
if (Swiped == true)
. But Swiped is false because listener is never automatically called upon setting, so activity is not started.And when a swipe happens, your program runs only what was defined in the listener. mContext.startActivity(myIntent);
doesn't exist either in onSwipeLeft()
or in onSwipeRight()
methods. They just putExtra
, then println
, and then set Swipe
to true. And then it moves on with user interface which has just called one of your onSwipe
methods. You must insert mContext.startActivity(myIntent);
in both of your listener methods.
You should change your code to this:
webView.setOnTouchListener(new SwipeListener(this)
{
@Override
public void onSwipeLeft()
{
articleID--;
//System.out.println("SWIPE_LEFT");
myIntent.putExtra("id", articleID);
System.out.println(myIntent.toString());
mContext.startActivity(myIntent);
}
@Override
public void onSwipeRight()
{
articleID++;
//System.out.println("SWIPE_RIGHT");
myIntent.putExtra("id", articleID);
System.out.println(myIntent.toString());
mContext.startActivity(myIntent);
}
});
UPDATE:
On the new problem, it seems like your myIntent turns out to be null somehow. It might be because of code-changing during attempts to fix it. Anyway, this update will probably not fail you. Make sure you do exactly as I describe.
webView.setOnTouchListener(new SwipeListener(this)
{
@Override
public void onSwipeLeft()
{
Intent myIntent = new Intent(mContext.getBaseContext(), ShowActivity.class);
articleID--;
myIntent.putExtra("id", articleID);
System.out.println(myIntent.toString());
mContext.startActivity(myIntent);
}
@Override
public void onSwipeRight()
{
Intent myIntent = new Intent(mContext.getBaseContext(), ShowActivity.class);
articleID++;
myIntent.putExtra("id", articleID);
System.out.println(myIntent.toString());
mContext.startActivity(myIntent);
}
});
Upvotes: 0