क्या ViewPager पर स्क्रॉल करना अक्षम करना संभव है


138

मैं जो एक ViewPagerInstantiates एक है View। खोज दृश्य पर वापस लौटने के दौरान मैं दृश्यदर्शी और चाइल्ड बटन दोनों को पल-पल में निष्क्रिय करना चाहता हूं। मैंने कॉल किया है viewPager.setEnabled(false)लेकिन यह इसे अक्षम नहीं करता है।

किसी को कोई विचार मिला?


जवाबों:


355

एक सरल समाधान की अपनी खुद की उपवर्ग बनाने के लिए है ViewPagerकि एक है private boolean, झंडा isPagingEnabled। फिर ओवरराइड करें onTouchEventऔर onInterceptTouchEventविधियाँ। यदि isPagingEnabledसमान है super, तो विधि को लागू करें return

public class CustomViewPager extends ViewPager {

    private boolean isPagingEnabled = true;

    public CustomViewPager(Context context) {
        super(context);
    }

    public CustomViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

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

    public void setPagingEnabled(boolean b) {
        this.isPagingEnabled = b;
    }
}

फिर अपनी Layout.XMLफ़ाइल में <com.android.support.V4.ViewPager>टैग के साथ किसी भी टैग को बदलें <com.yourpackage.CustomViewPager>

इस कोड को इस ब्लॉग पोस्ट से अनुकूलित किया गया था ।


2
greate समाधान, ठीक काम करता है। यदि आप बंदर की तरह स्वाइप करना बंद कर देना चाहते हैं, तो आप @Override public void onPageScrollStateChanged (अंतिम int राज्य) {स्विच (राज्य) {केस Viewerager.SCROLL_STATE_SETTLING: mPager.setPagingEnabled (झूठा) के साथ एक OnPageChangeListener को ओवरराइड कर सकते हैं; टूटना; मामला ViewPager.SCROLL_STATE_IDLE: mPager.setPagingEnabled (सत्य); टूटना; } // noop}
Informatic0re

13
PS: XML में, <yourpkgname.CustomViewPager ... के बजाय <com.android, support.v4.ViewPager का उपयोग करें ...
cc0w

इसी तरह के एक अन्य समाधान को जोड़ने के लिए, आप "JazzyViewPager" नामक लाइब्रेरी का उपयोग कर सकते हैं: github.com/jfeinstein10/JazzyViewPager , और बस सेटपार्टिंग कॉल करेंअनुभव (बूलियन)
Android डेवलपर

क्या केवल स्क्रॉल करना बंद करना संभव है? मैं केवल बाईं ओर स्क्रॉल कर सकता हूं
सैफ हमीद

उदाहरण के लिए गेम कंट्रोलर या कीबोर्ड का उपयोग करते समय पृष्ठों में तत्वों (बटन आदि) को केंद्रित करके "स्क्रॉल" करना अभी भी संभव है। कैसे पूरी तरह से निष्क्रिय करने के लिए? मुझे लगता है कि यह एक और प्रकार की घटना है जिसे बीच में रोका जाना चाहिए ...
डेविड फेरैंड

34

इस के लिए एक आसान तय है:

जब आप दृश्य स्क्रॉल को अक्षम करना चाहते हैं तब:

mViewPager.setOnTouchListener(new OnTouchListener() {

   public boolean onTouch(View arg0, MotionEvent arg1) {
      return true;
   }
}); 

और जब आप इसे फिर से सक्षम करना चाहते हैं:

mViewPager.setOnTouchListener(null);

वह तरकीब करेगा।


46
लगभग, लेकिन काफी नहीं। टच डाउन अभी भी होता है, इसलिए आप बहुत सारे छोटे स्वाइप करके पेजों को स्थानांतरित कर सकते हैं।
फ्लाइनी 75

@ अकील सेखरन को इस समस्या का सामना करना पड़ रहा था, इस जवाब का उपयोग करते समय फ्लिननी का सामना कर रही है .. लेकिन सौभाग्य से पता नहीं कैसे अचानक वह त्रुटि हो गई .. :) और एक आकर्षण की तरह काम किया !!
ज़ोंबी

आप थोड़ा स्वाइप के बहुत सारे ताकि आप अभी भी सार्वजनिक बूलियन onInterceptTouchEvent से अधिक (MotionEvent घटना) के लिए है सवारी के अनुसार slatons का जवाब कर सकते हैं {
रयान Heitner

28

यहाँ मेरे स्लैटन के उत्तर का हल्का वजन संस्करण है:

public class DeactivatableViewPager extends ViewPager {
    public DeactivatableViewPager(Context context) {
        super(context);
    }

    public DeactivatableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return !isEnabled() || super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return isEnabled() && super.onInterceptTouchEvent(event);
    }
}

मेरे कोड से आप पेजिंग को निष्क्रिय कर सकते हैं setEnable()


ओवरराइडिंग onInterceptTouchEvent()से इनपुट प्राप्त करने के लिए बच्चे के विचारों को रोका जा सकेगा। ज्यादातर मामलों में यह है नहीं अभिप्रेत व्यवहार।
एलेक्स सेमीनीक

19

मुझे एक सरल उपाय मिला।

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();

क्या यह सब आपके द्वारा उपयोग किया गया कोड है? यह मेरे लिए काम नहीं कर रहा है।
जेरेड बर्ग

17
मेरे लिए काम नहीं करता है। अभी भी बहुत कम स्वाइप कर सकते हैं।
DYS

यह कोड उचित नहीं है। यह बहुत धीरे-धीरे लटकते हुए दृश्य की तरह स्क्रॉल हो रहा है
घनश्याम नयमा

यह भाग्य द्वारा काम कर सकता है। ViewPager को अपडेट इस हैक को तोड़ सकता है।
सूचक नल

यह अभी भी कम से कम खींच रहा है (
ekashking

14

मैं इस समस्या को हल करने का एक और तरीका सुझाता हूं। विचार आपके दृश्य पेज को स्क्रॉल दृश्य द्वारा लपेट रहा है, ताकि जब यह स्क्रॉल दृश्य गैर-स्क्रॉल करने योग्य हो, तो आपका दृश्य पेज गैर-स्क्रॉल करने योग्य भी हो।

यहाँ मेरा XML लेआउट है:

        <HorizontalScrollView
            android:id="@+id/horizontalScrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true" >

            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="wrap_content"
                android:layout_height="match_parent" />

        </HorizontalScrollView>

कोई कोड की जरूरत है।

मेरे लिए ठीक काम करता है।


1
इन सभी जवाबों के बीच, मुझे लगता है कि यह सरल है और ठीक काम करता है !!
श्री

ठीक है ... लेकिन जब आप ViewPager में टुकड़े में से एक के रूप में एक नक्शा है तो ... यह एक समस्या है
19 ekashking

4

स्वाइप को अक्षम करने के लिए

 mViewPager.beginFakeDrag();

स्वाइप सक्षम करने के लिए

 mViewPager.endFakeDrag();

2
स्क्रॉल करना अभी भी संभव है, इसकी अभी धाराप्रवाह नहीं है। यह मूल रूप से समस्या को हल किए बिना गुणवत्ता को खराब कर रहा है।
बेंजामिन बासमासी

1
डुप्लिकेट उत्तर
रिकार्डो ए

3

मेरे लिए सबसे अच्छा समाधान है:

public class DeactivatedViewPager extends ViewPager {

    public DeactivatedViewPager (Context context) {
        super(context);
    }

    public DeactivatedViewPager (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean canScrollHorizontally(int direction) {
        return false;
    }
}

इसके बाद स्क्रॉल टच द्वारा अक्षम हो जाएगा और फिर आप setCurrentItemपेज बदलने के लिए विधि का उपयोग कर सकते हैं ।


पता नहीं क्यों, लेकिन यह बस काम नहीं किया। स्क्रॉलिंग अभी भी होती है।
रिकार्डो ए।

1
canScrollHorizontally()विधि मौजूदा परिदृश्य में कोई प्रभाव नहीं है। स्वाइप होने पर इसे बुलाया भी नहीं जाता।
एलेक्स सेमेनीक

3

यहाँ कोटलिन और androidX में एक जवाब है

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager

class DeactivatedViewPager @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null
) : ViewPager(context, attrs) {

    var isPagingEnabled = true

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        return isPagingEnabled && super.onTouchEvent(ev)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return isPagingEnabled && super.onInterceptTouchEvent(ev)
    }
}

2

इसके बारे में कैसे:
मैंने इस्तेमाल किया CustomViewPager
और अगला, स्क्रॉलटॉ विधि को ओवरराइड किया
मैंने बहुत सारे छोटे पाइपों को करते समय आंदोलन की जाँच की, यह अन्य पृष्ठों पर स्क्रॉल नहीं करता है।

public class CustomViewPager extends ViewPager {

    private boolean enabled;

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

    @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;
    } 

    @Override
    public void scrollTo(int x, int y) {
       if(enabled) {
          super.scrollTo(x, y);
       }
    }
}

मुझे यह समस्या थी कि देखने वाला अभी भी बहुत कम स्वाइप कर रहा था, लेकिन ओवरराइडिंग View.scrollTo(int x, int y)ने मेरे लिए इस समस्या को हल कर दिया। धन्यवाद
पाम

यह कुछ मामलों में कुछ अजीब व्यवहार का कारण बनता है। जैसे शून्य पर जाना और सिर्फ एक खाली पृष्ठ छोड़ना '-'
रिकार्डो ए।

2

ViewPager 2 अल्फा 2 का उपयोग करने के मेरे मामले में नीचे का स्निपेट काम करता है

viewPager.isUserInputEnabled = false

उपयोगकर्ता इनपुट अक्षम करने की क्षमता (setUserInputEnabled, isUserInputEnabled)

व्यूपेजर 2 में अधिक परिवर्तन के लिए इसका संदर्भ लें

इसके अलावा कुछ बदलाव नवीनतम संस्करण ViewPager 2 अल्फा 4 किए गए थे

अभिविन्यास और isUserScrollable विशेषताएँ अब SavedState का हिस्सा नहीं हैं

इसके लिए viewpager2 में अधिक परिवर्तन के लिए देखें # 1.0.0-Alpha04


1

Androidx से नया वर्ग ViewPager2 विधि सेट के साथ स्क्रॉलिंग को अक्षम करने की अनुमति देता है

private val pager: ViewPager2 by bindView(R.id.pager)

override fun onCreate(savedInstanceState: Bundle?) {
    pager.isUserInputEnabled = false
}

0

स्लेटन का जवाब ठीक काम करता है। यदि आप एक बंदर की तरह स्वाइप करना बंद करना चाहते हैं तो आप ऑनपेज चेंज लाइस्टनर को ओवरराइड कर सकते हैं

@Override public void onPageScrollStateChanged(final int state) { 
        switch (state) { 
            case ViewPager.SCROLL_STATE_SETTLING: 
                mPager.setPagingEnabled(false); 
                break; 
            case ViewPager.SCROLL_STATE_IDLE: 
                mPager.setPagingEnabled(true); 
                break; 
        } 
    }

तो आप केवल अगल-बगल स्वाइप कर सकते हैं


1
मुझे ViewPager की कोई विधि नहीं मिली जैसे कि setPagingEnabled (बूलियन वैल्यू)
राकेश यादव

setPagingEnabled (बूलियन मान) आपके द्वारा बनाया जाना है, क्योंकि इस तरह की कोई विधि ओवरराइड नहीं है।
खरक

अस्पष्ट है कि यह setPagingEnabled()विधि क्या करती है। कृपया पूरा कोड शामिल करें।
एलेक्स सेमीनीक

0
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;

public class NonSwipeableViewPager extends ViewPager {

public NonSwipeableViewPager(Context context) {
    super(context);
}

public NonSwipeableViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    // stop swipe 
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // stop switching pages
    return false;
}

private void setMyScroller() {
    try {
        Class<?> viewpager = ViewPager.class;
        Field scroller = viewpager.getDeclaredField("mScroller");
        scroller.setAccessible(true);
        scroller.set(this, new MyScroller(getContext()));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public class MyScroller extends Scroller {
    public MyScroller(Context context) {
        super(context, new DecelerateInterpolator());
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int 
duration) {
        super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
    }
}
}

फिर अपनी Layout.XML फ़ाइल में कोई भी --- com.android.support.V4.ViewPager --- टैग्स को --- com.yourpackage.NonSwipeableViewPager --- टैग के साथ बदलें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.