web-dev-qa-db-fra.com

Détecter le geste de balayage dans un fragment

Salut, j'ai implémenté un Fragment, et je veux détecter un événement tactile sur mon fragment.

Mais je ne peux pas détecter cet événement, en fait, aucun événement n'est détecté du tout. Cela fonctionne bien dans Activity, mais il ne fonctionne pas sur les fragments.

Voici mon code:

  public class Swipe_Fragment extends Fragment implements
    GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {

private SimpleGestureFilter detector;
private LinearLayout swipLinear;
private static int DEFAULT = 50;
private int brightness;
private GestureDetectorCompat mDetector;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.swipe_screen, container,
            false);
    swipLinear = (LinearLayout) rootView.findViewById(R.id.swipLinear);

    brightness = DEFAULT;
    mDetector = new GestureDetectorCompat(getActivity(), this);
    // Set the gesture detector as the double tap
    // listener.
    mDetector.setOnDoubleTapListener(this);
    // Detect touched area
    // detector = new SimpleGestureFilter(getActivity(), this);
    return rootView;
}


@Override
public boolean onDoubleTap(MotionEvent arg0) {
    Toast.makeText(getActivity(), "onDoubleTap", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    Toast.makeText(getActivity(), "onDoubleTapEvent", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    Toast.makeText(getActivity(), "onSingleTapConfirmed", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onDown(MotionEvent e) {
    Toast.makeText(getActivity(), "onDown", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    Toast.makeText(getActivity(), "onFling", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public void onLongPress(MotionEvent e) {
    Toast.makeText(getActivity(), "onLongPress", Toast.LENGTH_LONG).show();

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    Toast.makeText(getActivity(), "onScroll", Toast.LENGTH_LONG).show();
    return false;
}

@Override
public void onShowPress(MotionEvent e) {
    Toast.makeText(getActivity(), "onShowPress", Toast.LENGTH_LONG).show();

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    Toast.makeText(getActivity(), "onSingleTapUp", Toast.LENGTH_LONG).show();
    return false;
}

}
17
Siddhpura Amit

Enfin, j'ai obtenu une solution à partir du code ci-dessous, qui est de Android Fragment onCreateView with Gestures .

  final GestureDetector gesture = new GestureDetector(getActivity(),
    new GestureDetector.SimpleOnGestureListener() {

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
            Log.i(Constants.APP_TAG, "onFling has been called!");
            final int SWIPE_MIN_DISTANCE = 120;
            final int SWIPE_MAX_OFF_PATH = 250;
            final int SWIPE_THRESHOLD_VELOCITY = 200;
            try {
                if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                    return false;
                if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.i(Constants.APP_TAG, "Right to Left");
                } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                    && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    Log.i(Constants.APP_TAG, "Left to Right");
                }
            } catch (Exception e) {
                // nothing
            }
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    });

v.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gesture.onTouchEvent(event);
    }
});

Cela va dans la méthode onCreateView() du fragment.

25
Siddhpura Amit