2012-07-10 40 views
17

Tôi đang cố gắng sử dụng Cử chỉ trong một đoạn; Tôi có phần bên dưới của một FragmentActivity xử lý các đoạn chi tiết của tôi. Những gì tôi đang cố gắng xảy ra là khi một swipe được phát hiện trên màn hình để thay thế dữ liệu bên trong của khung nhìn đó với mục nhập trước đó hoặc kế tiếp.Android Fragment onCreateView with Gestures

Nếu có cách xử lý tốt hơn; Tôi là tất cả cho nó. Tuy nhiên, những gì đang xảy ra ở đây là phương thức onFling không bao giờ thực sự được gọi.

public static class DetailsFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     if (container == null) { 
      return null; 
     } 
     View v = inflater.inflate(R.layout.my_view, null, false); 
     final GestureDetector gesture = new GestureDetector(getActivity(), 
      new GestureDetector.SimpleOnGestureListener() { 
       @Override 
       public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
        float velocityY) { 

        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"); 
          titles.showDetails(getPosition() - 1); 
         } 
        } 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); 
      } 
     }); 

     return v; 
    } 
} 

Trả lời

43

Hình như các vấn đề sau đây giải thích điều này: Android: GestureDetector won't catch Gestures

Ngoài ra đây là kết quả:

Các giải pháp thực sự là để Override phương pháp onDown và return true; nếu không phát hiện cử chỉ sẽ dừng lại và không phát hiện lên:

 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); 
      } 
     }); 
+3

chỉ tò mò: tại sao tham chiếu đến cử chỉ bị mất? –

+1

@LemLordjeKo tại sao tham chiếu đến 'cử chỉ' bị mất? 'gesture' được giữ như một tham chiếu của' View.OnTouchListener' mà chúng ta tạo ra, và nó được giữ như là một tham chiếu bởi chính khung nhìn đó, 'v'. Java là đủ trưởng thành, nếu có một đường dẫn đến một đối tượng, nó gần như chắc chắn sẽ không nhận được GC'd. – bclymer

+0

Nhập khẩu sau đây là cần thiết để đoạn mã trên hoạt động: nhập android.view.View.OnTouchListener; nhập android.view.MotionEvent; nhập android.view.GestureDetector; nhập android.util.Log; Hằng số lớp học { Chuỗi cuối cùng tĩnh công khai APP_TAG = "mytag"; } – FuzzyAmi

2

một vài bình luận của

  1. tôi phải tinh chỉnh mã của tôi như sau:

    v.setOnTouchListener(new View.OnTouchListener() { 
        @Override   
        public boolean onTouch(View v, MotionEvent event) { 
    
         // return gesture.onTouchEvent(event); 
    
         gesture.onTouchEvent(event); 
         return true; // <-- this line made the difference 
        } 
    }); 
    
  2. Ngoài ra, nếu bạn đang sử dụng tệp xml để tạo chế độ xem của bạn

    View v = inflater.inflate(R.layout.my_view, null, false); 
    

đảm bảo bạn đang thực sự nhấn chế độ xem dự định. Một cách hay để phóng đại thử nghiệm là làm cho cả chiều rộng và chiều cao thành "match_parent" thay vì "wrap_content" trong tệp xml bố cục của bạn.

+0

Tôi đã bỏ lỡ @mwillbanks ghi đè onDown để trả về true cho SimpleOnGestureListener. Tôi chỉ thực hiện trên onSingleTapConfirmed và onDoubleTap. – gnemnk

Các vấn đề liên quan