ভিউপ্যাজারে স্ক্রোলিং অক্ষম করা কি সম্ভব?


138

আমি একটি ViewPagerযা তাত্ক্ষণিকভাবে একটি View। অনুসন্ধানের ফলাফলটি ভিউতে ফিরে আসার সময় আমি মুহুর্তে ভিউপ্যাজার এবং শিশু বোতামগুলির স্ক্রোলিং উভয়ই অক্ষম করতে চাই। আমি ফোন করেছি viewPager.setEnabled(false)কিন্তু এটি এটি অক্ষম করে না।

কেউ ধারণা পেয়েছে?


উত্তর:


355

একটি সহজ সমাধান হ'ল ViewPagerএটির নিজস্ব একটি সাবক্লাস তৈরি করা যার একটি private booleanপতাকা রয়েছে isPagingEnabled,। তারপরে onTouchEventonInterceptTouchEventপদ্ধতিগুলিকে ওভাররাইড করুন । যদি 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
গ্রেট দ্রবণ, সূক্ষ্ম কাজ করে। আপনি যদি একটি বানরের মতো সোয়াইপিং বন্ধ করতে চান তবে আপনি @ ওভাররাইড পাবলিক শূন্যপরে অন পেজস্ক্রোলস্টেটচেনজড (ফাইনাল ইনট স্টেট) {স্যুইচ (রাষ্ট্র) {কেস ভিউপেজ.এস.সিআরএলসিপিএসএসটিটিং: এমপেজ.সেটপেজিংএজেবল (মিথ্যা) দিয়ে ওভাররাইড করতে পারেন; বিরতি; কেস ভিউপেজ.এসআরসিআরএলসিপিএলআইডিএল: এমপেজারসেটপেজিংএজেবল (সত্য); বিরতি; no // নুপ}
তথ্য

13
পিএস: এক্সএমএলে, <কমপিড্রয়েড, সাপোর্ট.ভ ৪.ভিউপ্যাজারের পরিবর্তে <yourpkgname.CustomViewPager ... ব্যবহার করুন ...
thecr0w

অন্য অনুরূপ সমাধান যুক্ত করতে, আপনি "জাজিভিউপ্যাজার" নামে পরিচিত লাইব্রেরিটি ব্যবহার করতে পারেন: github.com/jfeinstein10/JazzyViewPager , এবং কেবল সেটপেজিংএনেবল (বুলিয়ান) কল করুন
অ্যান্ড্রয়েড বিকাশকারী

কেবলমাত্র স্ক্রোলিং বন্ধ করা কি সম্ভব? আমি কেবল বাম স্ক্রোলিং করতে পারি
সাইফ হামেদ

উদাহরণস্বরূপ গেম নিয়ামক বা কীবোর্ড ব্যবহার করার সময় পৃষ্ঠাগুলিতে উপাদানসমূহ (বোতাম ইত্যাদি) কে কেন্দ্র করে "স্ক্রোল" করা এখনও সম্ভব। কিভাবে সম্পূর্ণরূপে অক্ষম? আমার ধারণা এটি অন্য ধরণের ইভেন্ট যা বাধা দেওয়া উচিত ...
ডেভিড ফেরানড

34

এটির জন্য একটি সহজ সমাধান রয়েছে:

আপনি যখন ভিউপজার স্ক্রোলিং অক্ষম করতে চান তখন:

mViewPager.setOnTouchListener(new OnTouchListener() {

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

এবং আপনি যখন এটি পুনরায় সক্ষম করতে চান তখন:

mViewPager.setOnTouchListener(null);

যে কৌশলটি করবে।


46
প্রায়, কিন্তু বেশ না। টাচ ডাউনটি এখনও ঘটে তাই আপনি প্রচুর ছোট সোয়াইপ করে পৃষ্ঠাগুলি সরাতে পারেন।
ফ্লাইনি 75

এই উত্তরটি ব্যবহার করার সময় ফ্লিনি যে সমস্যার মুখোমুখি হচ্ছিলেন, তা অখিল শেখরান ঠিকই সমস্যার মুখোমুখি হয়েছিলেন .. তবে ভাগ্যক্রমে জানেন না কীভাবে হঠাৎ ত্রুটিটি চলে গেছে .. :) এবং মনোমুগ্ধকর মতো কাজ করেছিল !!
বোকচন্দর

আপনি প্রচুর পরিমাণে ছোট ছোট সোয়াইপ করতে পারেন যাতে আপনার এখনও পাবলিক বুলিয়ান অন্টরেসেপ্টটচ এভেন্ট (মোশনইভেন্ট ইভেন্ট) এর উপর দিয়ে যেতে হবে sla স্লটনের উত্তর অনুসারে রাইড করুন
রায়ান হিটনার

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()শিশুদের দর্শনগুলি ইনপুট পেতে বাধা দেবে। অধিকাংশ ক্ষেত্রে এই হল না দেয়ার উদ্দেশ্যে আচরণ।
অ্যালেক্স Semeniuk

19

আমি একটি সহজ সমাধান খুঁজে পেয়েছি।

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();

এটিই কি আপনি ব্যবহার করেছেন সমস্ত কোড? এটি আমার জন্য কাজ করছে না।
জ্যারেড বুড়ো

17
আমার জন্য কাজ করে না। তবুও অল্প পরিমাণে সোয়াইপ করতে পারে।
DYS

এই কোডটি সঠিক বিসিজেড নয় এটি হ্যাং ভিউয়ের মতো খুব ধীরে ধীরে স্ক্রোল করছে
ঘনশ্যাম নায়মা

ভাগ্যক্রমে এটি কাজ করতে পারে। ভিউপ্যাজারে আপডেট করা এই হ্যাকটিকে ভেঙে ফেলতে পারে।
পয়েন্টার নল

এটা এখনও টেনে কিন্তু একটু একটু করে (।
ekashking

14

আমি এই সমস্যার সমাধানের জন্য আরেকটি উপায়ের পরামর্শ দিচ্ছি। ধারণাটি আপনার ভিউপেজারটিকে একটি স্ক্রোলভিউ দিয়ে মোড়ানো করছে, যাতে এই স্ক্রোলভিউ যখন অ-স্ক্রোলযোগ্য হয়, তখন আপনার ভিউপিজারটিও স্ক্রোলযোগ্য নয়।

এখানে আমার এক্সএমএল লেআউটটি রয়েছে:

        <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
এই সমস্ত উত্তরগুলির মধ্যে, আমি মনে করি এটি সহজ এবং ঠিকঠাক কাজ করে !!
শ্রী

ঠিক আছে ... তবে আপনি যখন
ভিউপাগারে

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()পদ্ধতি বর্তমান দৃশ্যকল্প কোনো প্রভাব নেই। এমনকি যখন সোয়াইপ হয় এটি বলা হয় না।
অ্যালেক্স Semeniuk

3

কোটলিন এবং অ্যান্ড্রয়েডএক্স এ এখানে একটি উত্তর

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

ভিউপ্যাজার 2 আলফা 2 ব্যবহারের ক্ষেত্রে আমার নীচের স্নিপেট কাজ করে

viewPager.isUserInputEnabled = false

ব্যবহারকারীর ইনপুট অক্ষম করার ক্ষমতা (setUserInputEnabled, isUserInputEn सक्षम)

ভিউপেজার ২.০.০-আলফা02-এ আরও পরিবর্তনের জন্য এটি উল্লেখ করুন

এছাড়াও কিছু পরিবর্তন করা হয়েছে সর্বশেষ সংস্করণ ভিউপ্যাজার 2 আলফা 4

ওরিয়েন্টেশন এবং isUserScrollable বৈশিষ্ট্যগুলি আর সেভডস্টেটের অংশ নয়

ভিউপ্যাজার 2 # 1.0.0-alpha04 এ আরও পরিবর্তনের জন্য এটি উল্লেখ করুন


1

অ্যান্ড্রয়েড থেকে নতুন ক্লাসের ভিউপ্যাজার 2 পদ্ধতি সেটআপের সাথে স্ক্রোলিং অক্ষম করতে দেয়

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
ভিউপ্যাজারের কোনও পদ্ধতি আমি পাইনি যেমন সেটপেইজিংএএনবেবল (বুলিয়ান মান)
রাকেশ যাদব

সেটপেইজিংএনেবল (বুলিয়ান মান) আপনাকে তৈরি করতে হবে, কারণ ওভাররাইড করার মতো কোনও পদ্ধতি নেই।
খারাক

এই setPagingEnabled()পদ্ধতিটি কী করে তা অস্পষ্ট । সম্পূর্ণ কোড অন্তর্ভুক্ত করুন।
অ্যালেক্স Semeniuk

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*/);
    }
}
}

তারপরে আপনার লেআউট.এক্সএমএল ফাইলটিতে যে কোনও --- com.android.support.V4.ViewPager --- ট্যাগগুলিকে --- com.yourpackage.NonSwipeableViewPager --- ট্যাগ সহ প্রতিস্থাপন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.