में टैब के बीच स्वाइपिंग अक्षम करें मेरे पास 2 टैब्ड टुकड़ों के साथ एक (शेरलॉक) फ्रैगमेंट एक्टिविटी है। बायां खंड एक ग्रिड व्यू है जो एक एल्बम की तस्वीरों को प्रदर्शित करता है और दाएं टुकड़े में व्यूपेजर होता है जिसका उपयोग व्यक्तिगत चित्रों को देखने के लिए किया जाता है। बाएं टुकड़े से आप चित्रों के माध्यम से स्क्रॉल कर सकते हैं और एक का चयन कर सकते हैं। सही टुकड़े पर टैब्बिंग (या स्वाइपिंग) तस्वीर दिखाएगी और क्योंकि यह एक व्यूपेजर है जिसे आप पिछली या अगली तस्वीर पर स्वाइप कर सकते हैं।FragmentActivity
यह बहुत अच्छा काम करता है सिवाय इसके कि फ्रैगमेंट एक्टिविटी सही स्वाइप को रोकना और बाएं टैब पर वापस जाना चाहता है। मैं सही टैब पर होने पर स्वाइप को अवरुद्ध करने से फ्रैगमेंट एक्टिविटी को रोकना चाहता हूं। अगर मुझे टैब के बीच स्वाइपिंग को अक्षम करना पड़ा तो यह संतोषजनक होगा। मैं बस स्वाइपिंग को वर्तमान टैब पर समर्पित करना चाहता हूं और टैब के बीच स्थानांतरित करने के लिए उपयोग नहीं किया जाता।
निम्नलिखित छवियां वर्तमान व्यवहार को इंगित करती हैं। सही छवि दिखाती है कि जब मैं दाईं ओर स्वाइप करता हूं तो क्या होता है। जैसा कि आप देख सकते हैं कि बायां टैब प्रकट होना शुरू होता है। मैं चाहता हूं कि स्वाइप केवल दाएं टैब पर लागू हो ताकि मैं बाएं टैब के बिना छवियों के बीच स्वाइप कर सकूं।
मैं समाधान एक 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>
"खंड में कस्टमव्यू पेजर को लागू करने के बजाय इसे फ्रैगमेंट एक्टिविटी पर लागू करने की आवश्यकता है"। मैंने यह नहीं बताया कि आपको इसे टुकड़े पर लागू करने की आवश्यकता है और न ही मैंने जो लिंक प्रदान किया है। आपका उत्तर सिर्फ लिंक से कोड कॉपी करता है जो पहले ही पूरी तरह से बताता है कि स्वाइपिंग को अक्षम करने के लिए ऑन इंटरसेप्ट टचवेन्ट को ओवरराइड कैसे करें। – Ljdawson