web-dev-qa-db-ja.com

フラグメントのスワイプジェスチャーを検出する

こんにちは、Fragmentを実装しました。フラグメントのタッチイベントを検出したいと思います。

しかし、私はそのイベントを検出することはできません。実際のところ、イベントはまったく検出されません。 Activityではうまく機能しますが、フラグメントでは機能しません。

以下は私のコードです:

  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

最後に、以下のコードからソリューションを取得しました。これは 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);
    }
});
_

これは、フラグメントのonCreateView()メソッドで行われます。

25
Siddhpura Amit