2012-11-01 15 views
12

में टैब के बीच स्वाइपिंग अक्षम करें मेरे पास 2 टैब्ड टुकड़ों के साथ एक (शेरलॉक) फ्रैगमेंट एक्टिविटी है। बायां खंड एक ग्रिड व्यू है जो एक एल्बम की तस्वीरों को प्रदर्शित करता है और दाएं टुकड़े में व्यूपेजर होता है जिसका उपयोग व्यक्तिगत चित्रों को देखने के लिए किया जाता है। बाएं टुकड़े से आप चित्रों के माध्यम से स्क्रॉल कर सकते हैं और एक का चयन कर सकते हैं। सही टुकड़े पर टैब्बिंग (या स्वाइपिंग) तस्वीर दिखाएगी और क्योंकि यह एक व्यूपेजर है जिसे आप पिछली या अगली तस्वीर पर स्वाइप कर सकते हैं।FragmentActivity

यह बहुत अच्छा काम करता है सिवाय इसके कि फ्रैगमेंट एक्टिविटी सही स्वाइप को रोकना और बाएं टैब पर वापस जाना चाहता है। मैं सही टैब पर होने पर स्वाइप को अवरुद्ध करने से फ्रैगमेंट एक्टिविटी को रोकना चाहता हूं। अगर मुझे टैब के बीच स्वाइपिंग को अक्षम करना पड़ा तो यह संतोषजनक होगा। मैं बस स्वाइपिंग को वर्तमान टैब पर समर्पित करना चाहता हूं और टैब के बीच स्थानांतरित करने के लिए उपयोग नहीं किया जाता।

निम्नलिखित छवियां वर्तमान व्यवहार को इंगित करती हैं। सही छवि दिखाती है कि जब मैं दाईं ओर स्वाइप करता हूं तो क्या होता है। जैसा कि आप देख सकते हैं कि बायां टैब प्रकट होना शुरू होता है। मैं चाहता हूं कि स्वाइप केवल दाएं टैब पर लागू हो ताकि मैं बाएं टैब के बिना छवियों के बीच स्वाइप कर सकूं।

enter image description here

मैं समाधान एक ViewPager भीतर स्वाइप को नियंत्रित लेकिन टैब किए टुकड़े के बीच स्वाइप नियंत्रित करने के लिए एक समाधान खोजने के लिए अभी तक है करने के लिए देखते हैं।

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical"> 
    <FrameLayout android:id="@android:id/tabcontent" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
    <GridView xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/gridview" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:columnWidth="100dip" 
       android:gravity="center" 
       android:horizontalSpacing="4dip" 
       android:numColumns="auto_fit" 
       android:stretchMode="columnWidth" 
       android:verticalSpacing="4dip" /> 
    </FrameLayout> 
</LinearLayout> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical"> 

    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
            android:id="@+id/pager" 
            android:layout_width="fill_parent" 
            android:layout_height="0px" 
            android:layout_weight="1"/> 
</LinearLayout> 

यहाँ ViewPager टुकड़ा का एक कोड सारांश:

यहाँ GridView टुकड़ा और ViewPager टुकड़ा के लिए एक्सएमएल है

:

public class FragmentFlash extends SherlockFragment { 

    private GestureDetector gestureDetector; 
    View.OnTouchListener gestureListener; 
    private ViewPager pager = null; 
    private int pagerPosition; 

    @Override 
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     pagerPosition = 0; 
     // Gesture detection 
     gestureDetector = new GestureDetector(new MyGestureDetector()); 
     gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       return gestureDetector.onTouchEvent(event); 
      } 
     }; 
     } 

    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.flash, container, false); 
     pager = (ViewPager) v.findViewById(R.id.pager); 
     pager.setOnTouchListener(gestureListener); 
     return v; 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     private static final int SWIPE_MIN_DISTANCE = 10; 
     private static final int SWIPE_MAX_OFF_PATH = 250; 
     private static final int SWIPE_THRESHOLD_VELOCITY = 50; 

     @Override 
     public boolean onDown(MotionEvent e) { 
     return true;//false; make onFling work with fragments 
     } 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      else 
       // right to left swipe 
       if(distanceX > SWIPE_MIN_DISTANCE) { 
        if (pagerPosition < imageUrls.length-1) 
        pager.setCurrentItem(++pagerPosition); 
       // left to right swipe 
       } else if (distanceX < -SWIPE_MIN_DISTANCE) { 
        if (pagerPosition > 0) 
        pager.setCurrentItem(--pagerPosition); 
       } 
      return true; 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
     } 
    } 

    private class ImagePagerAdapter extends PagerAdapter { 

     private String[] images; 
     private LayoutInflater inflater; 

     ImagePagerAdapter(String[] images) { 
     this.images = images; 
     inflater = mContext.getLayoutInflater(); 
     } 

     @Override 
     public void destroyItem(View container, int position, Object object) { 
     ((ViewPager) container).removeView((View) object); 
     } 

     @Override 
     public void finishUpdate(View container) { 
     } 

     @Override 
     public int getCount() { 
     return images.length; 
     } 

     @Override 
     public Object instantiateItem(View view, int position) { 
     final View imageLayout = inflater.inflate(R.layout.item_pager_image, null); 
     final ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image); 
     final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading); 

     byte[] image = ;//get byte array from file at images[position]; 
     if (null != image) { 
      Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length); 
      imageView.setImageBitmap(bitmap); 
     } 
     ((ViewPager) view).addView(imageLayout, 0); 

     return imageLayout; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) { 
     return view.equals(object); 
     } 

     @Override 
     public void restoreState(Parcelable state, ClassLoader loader) { 
     } 

     @Override 
     public Parcelable saveState() { 
     return null; 
     } 

     @Override 
     public void startUpdate(View container) { 
     } 
    } 

    public void pagerPositionSet(int pagerPosition, String[] imageUrls) { 
     Log.i(Flashum.LOG_TAG, "FragmentFlash pagerPositionSet: " + pagerPosition); 
     if (pagerPosition >= 0) 
     this.pagerPosition = pagerPosition; 
     if (pager != null) { 
     pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
     pager.setCurrentItem(this.pagerPosition); 
     } 
    } 

} 

यह item_pager_image.xml है

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="1dip" > 

    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:adjustViewBounds="true" 
     android:contentDescription="@string/descr_image" /> 

    <ProgressBar 
     android:id="@+id/loading" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:visibility="gone" /> 

</FrameLayout> 

उत्तर

17

ठीक है, मैं अंत में यह पता लगा। लॉरेंस डॉसन सही रास्ते पर थे लेकिन विभाजन के लिए कस्टमव्यूपेजर को लागू करने के बजाय इसे फ्रैगमेंट एक्टिविटी पर लागू करने की आवश्यकता है। आप देखते हैं, टैब के बीच स्विचिंग, जो गतिविधि द्वारा प्रबंधित की जाती है, एक व्यूपेगर एडाप्टर भी है। इस प्रकार, गतिविधि के लिए एक्सएमएल

<TabHost 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0"/> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:layout_weight="0"/> 

     <com.Flashum.CustomViewPager 
      android:id="@+id/pager" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"/> 

    </LinearLayout> 
</TabHost> 

है और कस्टम ViewPager सिवाय इसके कि सुझाव दिया है के रूप में है कि निर्माता यह गलत वापस जाने के लिए onInterceptTouchEvent पैदा करने के लिए सक्षम बनाता है। यह फ्रैगमेंट एक्टिविटी को स्वाइप पर अभिनय से रोकता है ताकि इसे टुकड़े के लिए समर्पित किया जा सके!

public class CustomViewPager extends ViewPager { 

    private boolean enabled; 

    public CustomViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.enabled = **false**; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (this.enabled) { 
      return super.onTouchEvent(event); 
     } 

     return false; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     if (this.enabled) { 
      return super.onInterceptTouchEvent(event); 
     } 

     return false; 
    } 

    public void setPagingEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 
} 
+0

"खंड में कस्टमव्यू पेजर को लागू करने के बजाय इसे फ्रैगमेंट एक्टिविटी पर लागू करने की आवश्यकता है"। मैंने यह नहीं बताया कि आपको इसे टुकड़े पर लागू करने की आवश्यकता है और न ही मैंने जो लिंक प्रदान किया है। आपका उत्तर सिर्फ लिंक से कोड कॉपी करता है जो पहले ही पूरी तरह से बताता है कि स्वाइपिंग को अक्षम करने के लिए ऑन इंटरसेप्ट टचवेन्ट को ओवरराइड कैसे करें। – Ljdawson

9

आपको अपने ViewPager के लिए ऑन इंटरसेप्ट टचवेन्ट विधि को ओवरराइड करने की आवश्यकता है, आप विस्तार ViewPager कर ऐसा करते हैं या इस जोड़ने पर एक महान ट्यूटोरियल के लिए इस लिंक पर जा सकते हैं:

http://blog.svpino.com/2011/08/disabling-pagingswiping-on-android.html

+1

मैंने इस कोड को आजमाया और पाया कि यह केवल ViewPager खंड में स्वाइपिंग को नियंत्रित करने के लिए है। यह FragmentActivity को टैब के बीच स्वाइप करने की कोशिश करने से नहीं रोकता है। दूसरे शब्दों में, जब मैं दाईं ओर स्वाइप करता हूं न केवल MyGestureDetector :: onScroll() को कॉल किया जाएगा, लेकिन बाएं टैब बाईं ओर दिखाई देने लगेगा जो दर्शाता है कि FragmentActivity भी स्वाइप का पता लगा रहा है और प्रसंस्करण कर रहा है। – cdavidyoung

+0

मुझे यकीन नहीं है कि आपके पास एक इशारा डिटेक्टर क्यों है, ViewPager आपके लिए – Ljdawson

+0

के लिए सभी स्वाइपिंग को संभालता है, मैंने ऐसा किया ताकि मैं स्वाइप की संवेदनशीलता को समायोजित कर सकूं। अब बहुत छोटे स्वाइप के साथ मैं दाहिने टैब में रह सकता हूं। हालांकि, एक सामान्य स्वाइप के साथ FragmentActivity इसका पता लगाता है और लेता है।बीटीडब्लू, मैंने अपने इशारा डिटेक्टर को अक्षम करने का प्रयास किया और यहां तक ​​कि कस्टम व्यूपेजर के साथ भी संदर्भित किया गया है, इससे मदद नहीं मिलती है। – cdavidyoung

संबंधित मुद्दे