Question

I have two fragments with-in an activity. I want to implement swipe in one of those fragments. My layout is:

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

    <fragment
        android:id="@+id/image_list_fragment"
        android:name="com.example.fragments.QGridFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="100" >
    </fragment>

    <fragment
        android:id="@+id/image_viewer_fragment"
        android:name="com.example.fragments.QViewerFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="85" />

</LinearLayout>

I want to implement swipe in image_viewer_fragment fragment. I'm looking for a way either using ViewPager or GestureListener. For normal activity with no fragments in it I'm able to do using this approach.

Was it helpful?

Solution

I tried to implement swipe functionality in my application and for that I created a class SwipeDetector which implements OnTouchListener.

Below is the code:

import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class SwipeDetector implements OnTouchListener {

    public static enum Action {
        LR, // Left to Right
        RL, // Right to Left
        TB, // Top to bottom
        BT, // Bottom to Top
        None, // when no action was detected
        Click
    }

    private static final String logTag = "SwipeDetector";
    private static final int MIN_DISTANCE = 100;
    private float downX, downY, upX, upY;
    private Action mSwipeDetected = Action.None;

    public boolean swipeDetected() {
        return mSwipeDetected != Action.None;
    }

    public Action getAction() {
        return mSwipeDetected;
    }

    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            downX = event.getX();
            downY = event.getY();
            mSwipeDetected = Action.None;
            // Log.i(logTag, "Click On List" );
            return false; // allow other events like Click to be processed
        }
        case MotionEvent.ACTION_UP: {
            upX = event.getX();
            upY = event.getY();

            float deltaX = downX - upX;
            float deltaY = downY - upY;

            // horizontal swipe detection
            if (Math.abs(deltaX) > MIN_DISTANCE) {
                // left or right
                if (deltaX < 0) {

                    mSwipeDetected = Action.LR;
                    return false;
                }
                if (deltaX > 0) {

                    mSwipeDetected = Action.RL;
                    return false;
                }
            }
            /*
             * else
             * 
             * // vertical swipe detection if (Math.abs(deltaY) > MIN_DISTANCE)
             * { // top or down if (deltaY < 0) { Log.i(logTag,
             * "Swipe Top to Bottom"); mSwipeDetected = Action.TB; return false;
             * } if (deltaY > 0) { Log.i(logTag, "Swipe Bottom to Top");
             * mSwipeDetected = Action.BT; return false; } }
             */

            mSwipeDetected = Action.Click;
            return false;
        }
        }
        return false;
    }

}

In onCreateView method of fragment in which you want to add swipe action, implement SwipeDetector by setting it in setOnTouchListener method of view.

Like this:

SwipeDetector swipeDetector = new SwipeDetector();
view.setOnTouchListener(swipeDetector);

if (swipeDetector.getAction() == Action.LR) {
   //Do some action
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top