ভিউপ্যাজারে আঙুল দিয়ে সোয়াইপ করে পেজিং কীভাবে অক্ষম করবেন তবে প্রোগ্রামোমেটিকভাবে সোয়াইপ করতে সক্ষম হবেন?


549

আমার ভিউপেজার রয়েছে এবং এর নীচে আমার কাছে 10 টি বোতাম রয়েছে। বোতামে ক্লিক করে, উদাহরণস্বরূপ # 4, পেজার তত্ক্ষণাত্ পৃষ্ঠা # 4 এ চলে যায় mPager.setCurrentItem(3);। তবে, আমি অনুভূমিকভাবে আঙুল দিয়ে সোয়াইপ করে পেজিংটি অক্ষম করতে চাই। সুতরাং, পেজিং সম্পন্ন করা হয় কেবলমাত্র বোতাম ক্লিক করে। সুতরাং, আমি কীভাবে আঙুল দিয়ে সোয়াইপিং অক্ষম করতে পারি?


প্রথম স্থানে ভিউফ্লিপার ব্যবহার সম্পর্কে কীভাবে ? এটি আপনাকে মাথা ব্যথার এক বিরাট কাজ বাঁচায়।
অ্যালেক্স Semeniuk

উত্তর:


885

আপনার সাবক্লাস করা দরকার ViewPageronTouchEventএতে অনেকগুলি ভাল জিনিস রয়েছে যা আপনি সন্তানের দর্শনগুলি স্পর্শ পেতে দেওয়ার মতো পরিবর্তন করতে চান না। onInterceptTouchEventআপনি কি পরিবর্তন করতে চান আপনি যদি কোডটির দিকে তাকান ViewPager, আপনি মন্তব্যটি দেখতে পাবেন:

    /*
     * This method JUST determines whether we want to intercept the motion.
     * If we return true, onMotionEvent will be called and we do the actual
     * scrolling there.
     */

এখানে একটি সম্পূর্ণ সমাধান:

প্রথমে আপনার srcফোল্ডারে এই শ্রেণিটি যুক্ত করুন :

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);
        setMyScroller();
    }

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Never allow swiping to switch between pages
        return false;
    }

    //down one is added for smooth scrolling

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

এরপরে, নিয়মিত পরিবর্তে এই ক্লাসটি ব্যবহার করার বিষয়টি নিশ্চিত করুন ViewPager, যা আপনি সম্ভবত নির্দিষ্ট করেছেন android.support.v4.view.ViewPager। আপনার লেআউট ফাইলটিতে, আপনি এটিকে এমন কিছু দিয়ে নির্দিষ্ট করতে চাই:

<com.yourcompany.NonSwipeableViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

এই বিশেষ উদাহরণটি একটিতে রয়েছে এবং LinearLayoutএটি পুরো পর্দাটি গ্রহণ করতে বোঝায়, যে কারণে layout_weightএটি 1 এবং 0 layout_heightডিপি হয়।

এবং setMyScroller();পদ্ধতিটি মসৃণ রূপান্তরের জন্য


3
@ লুইয়েলুই একটি পার্শ্ব-নোটে: কোনও নির্দিষ্ট কারণ আছে, কেন আপনি পূর্ণ স্ক্রিন প্রভাব অর্জনের জন্য উচ্চতার চেয়ে উচ্চতা 0dp/ 1ওজন সমাধানকে বেছে নিয়েছেন match_parent? আপনি কি এর দ্বারা কর্মক্ষমতা উন্নতি অর্জন করেন?
উবুন্টুড্রয়েড

28
এই উত্তরটি বাম / ডান কীগুলি কী বোর্ড ব্যবহার করার সময় পৃষ্ঠা স্যুইপিং প্রতিরোধ করে না (এটি এমুলেটরটিতে চেষ্টা করুন)। টাচ ডিভাইসের জন্য সমস্যা নাও হতে পারে তবে টিভি এবং ল্যাপটপের সাথে এটি এক হতে পারে।
ভিনসেন্ট মিমুন-প্রট

8
@ মারভিন ল্যাবস @ থোর্বার কীবোর্ড দ্বারা পৃষ্ঠা স্ক্রোলটি অক্ষম করার সঠিক উপায়টি ওভাররাইড করা executeKeyEvent()। এটি সেই পদ্ধতি যা কল করে allowScroll()// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys @Override public boolean executeKeyEvent(KeyEvent event) { return false; }
আরাক করে

6
ঠিক আছে, এটি উল্লম্ব স্ক্রোলিংটিও অক্ষম করে ... এটি যদি খারাপ হয়, আপনি যদি তালিকা ভিউ ব্যবহার করছেন।
maysi

5
আমি আশা করি গুগল কেবল এমন একটি পদ্ধতি সরবরাহ করতে পারত যেখানে আমরা স্পর্শ / সোয়াইপিং পরিচালনা করতে আমাদের ইন্টারফেস পদ্ধতিটি সরবরাহ করি কারণ আমার বিশ্বাস যে এটির ক্ষতি হবে না?
নিয়ন ওয়ার্জ

466

এর আরও সাধারণ বর্ধিতাংশ ViewPagerহ'ল কোনও SetPagingEnabledপদ্ধতি তৈরি করা যাতে আমরা ফ্লাইতে পেজিং সক্ষম ও অক্ষম করতে পারি। সোয়াইপিং সক্ষম / অক্ষম করতে, কেবল দুটি পদ্ধতির ওভারাইড করুন: onTouchEventএবং onInterceptTouchEvent। পেজিং অক্ষম করা থাকলে উভয়ই "মিথ্যা" ফিরবেন।

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

তারপরে এক্সএমএলে অন্তর্নির্মিত ভিউপ্যাজারের পরিবর্তে এটি নির্বাচন করুন

<mypackage.CustomViewPager 
    android:id="@+id/myViewPager" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" />

আপনাকে কেবল এই setPagingEnabledপদ্ধতিতে কল falseকরতে হবে এবং ব্যবহারকারীরা প্যাগিনেটে সোয়াইপ করতে পারবেন না।


3
এমন এক দৃশ্যের জন্য নিখুঁতভাবে কাজ করে যাতে একাধিক মতামত রয়েছে যেখানে কেউ অনুভূমিক স্ক্রোলিং ব্যবহার করে (যেমন, AChartEngine চার্ট)। আমার খণ্ডে আমি আমার ক্রিয়াকলাপে কলব্যাকটি ব্যবহার করে বলি যে ব্যবহারকারী চার্টটি (ACTION_MOVE) স্পর্শ করেছে বা এটিকে রেখে দিয়েছে তার উপর নির্ভর করে "পেজিংটি চালু বা বন্ধ করতে হবে" (অ্যাকশন_সিএনএসএল)। অনেক ধন্যবাদ!
চক্র

32
আপনি নিজের onTouchEventএবং onInterceptTouchEventপদ্ধতিগুলি সহজ করতে পারেনreturn enabled && super.onTouchEvent(event);
nbarraille

2
@nbarraille এটি কেবল স্টাইলের বিষয়। আপনার কাছে আরও পড়ার মতো স্টাইলটি আপনি ব্যবহার করতে পারেন।
রাজুল

7
আমি ফিল্ডের নাম "সক্ষম" থেকে "সোয়াইপপেজ চ্যাঞ্জইনএবলড" বা এর মতো কিছুতে পরিবর্তনেরও পরামর্শ দেব। কোডটি লেখার এক মাস পরে আপনি "সক্ষম" অর্থ কী তা খুব কমই মনে করবেন, বিশেষত যখন আপনার শ্রেণিকে "কাস্টমভিউপেজার" বলা হয়, যেখানে এটি কাস্টমাইজেশন কী তা পরিষ্কার নয়। এটি শৈলীর বিষয়, তবে শৈলীর বিষয়গুলি যদি আপনি অসমর্থিত প্রকল্পের সাথে শেষ করতে না চান তবে এটি ঠিক করার চেয়ে সম্পূর্ণরূপে পুনর্লিখন করা সহজ।
বাইটফু

3
আমি সেটপেইজিংএনেবলড কই? ._।
নিকটকি

107

সহজ উপায় হয় setOnTouchListenerএবং বিনিময়ে trueজন্য ViewPager

mPager.setOnTouchListener(new OnTouchListener()
    {           
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            return true;
        }
    });

53
কখনও কখনও কাজ করে না। আমি একটি ফ্র্যাগমেন্টপেজার অ্যাডাপ্টার এবং কয়েকটি খণ্ড সহ একটি ভিউপ্যাজার ব্যবহার করছি। পেজারে অন্টচলাইস্টেনার সেট করার পরে, আমি যদি বাম দিকে ঝোঁক, ইউআই এখনও কিছুটা বাম দিকে চলে যাবে।
ক্রিস.জু

16
আপনি pager.setCurrentItem(pager.getCurrentItem());ফিরে আসার আগে যুক্ত করলে এটি কাজ করে true
ডিএনজি

1
এটা আমার জন্য আগে কাজ করে। কেন এটি আর ভাল কাজ করে না ধারণা নেই।
অ্যান্ড্রয়েড বিকাশকারী

আমার জন্য কাজ করে বলে মনে হয়. public int getItemPosition(Object object) { return POSITION_NONE; }আমার অ্যাডাপ্টারে কিছু লেআউট গ্ল্যাচগুলি সমাধান করার জন্য যা পৃষ্ঠাগুলির বিনোদন এবং সম্ভবত অন্যান্য সমস্যাগুলি সমাধান করার জন্য বাধ্য করে।
ধরে রাখুন

6
এটি একটি পার্টলি ওয়ার্কিং সলিউশন। অনুভূমিক সোয়াইপগুলি কিছু অদ্ভুত উপায়ে পরিচালনা করা হয়। আমি ভিউপ্যাজারের অংশ হিসাবে এটি ড্রাগন ড্রপ গ্রিডভিউ দিয়ে পরীক্ষা করেছি। এই সমাধানটি ব্যবহার করে টেনে আনার সময়, বাম থেকে ডানে এবং ডান থেকে বামে টেনে আনতে ব্যর্থ হয়। ব্যক্তিগতভাবে আমি রাজুলের পদ্ধতিকে সবচেয়ে সেরা বলে মনে করি।
টন স্নোই

58

এটি স্টাইলযোগ্য হিসাবে ঘোষণা করা আরও ভাল, যাতে আপনি এর সম্পত্তিটি এক্সএমএল থেকে পরিবর্তন করতে পারেন:

private boolean swipeable;

public MyViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
    try {
        swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
    } finally {
        a.recycle();
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return swipeable ? super.onInterceptTouchEvent(event) : false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return swipeable ? super.onTouchEvent(event) : false;
}

এবং আপনার মানগুলিতে / অ্যাটর্েক্সএক্সএমএল:

<declare-styleable name="MyViewPager">
  <attr name="swipeable" format="boolean" />
</declare-styleable>

যাতে আপনি এটি আপনার লেআউট xML ব্যবহার করতে পারেন:

<mypackage.MyViewPager
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:swipeable="false" />

অবশ্যই, আপনি এখনও একটি পেতে / সেট সম্পত্তি থাকতে পারে।


58

শুধুমাত্র উপেক্ষা onTouchEventএবং onInterceptTouchEventক্ষেত্রে যথেষ্ট নয় আপনি ViewPager নিজেই অন্য ViewPager ভিতরে আছে। চাইল্ড ভিউপেজার তার প্রথম / শেষ পৃষ্ঠায় অবস্থিত না হলে পিতামাতা ভিউপ্যাজারের কাছ থেকে অনুভূমিক স্ক্রোল স্পর্শ ইভেন্টগুলি চুরি করবে।

এই সেটআপটি সঠিকভাবে কাজ করতে আপনাকে canScrollHorizontallyপদ্ধতিটি ওভাররাইড করতে হবে ।

দেখুন LockableViewPagerনিচের বাস্তবায়ন।

public class LockableViewPager extends ViewPager {

    private boolean swipeLocked;

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

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

    public boolean getSwipeLocked() {
        return swipeLocked;
    }

    public void setSwipeLocked(boolean swipeLocked) {
        this.swipeLocked = swipeLocked;
    }

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

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

    @Override
    public boolean canScrollHorizontally(int direction) {
        return !swipeLocked && super.canScrollHorizontally(direction);
    }

}

3
আপনাকে ধন্যবাদ, এটি অন্য ভিউপাগারের ভিতরে ভিউপ্যাজারে খুব ভাল কাজ করে।
ফার্নানদা বারী

1
এটি আমার জন্য, অন্য ভিউপ্যাজারের ভিতরে থাকা ভিউপ্যাজারের জন্যও কাজ করে। সঠিক সমাধান আমার ক্ষেত্রে সে ক্ষেত্রে কার্যকর হয়নি।
রাফায়েল রুইজ

ট্যাবগুলিতে ব্যবহৃত হওয়ার সময় অ্যানিমেশনটিও থামায়।
habষভ শ্রীবাস্তব

যদি আমি এটি অক্ষম করি এবং মনে করি আমি এটি সক্ষম করতে চাই তবে সেট স্যুইস্পলকড (মিথ্যা) কল করতে ইভেন্টটি কোথায় পাব?
রবি যাদব

57

এখন আমাদের কাস্টম তৈরি করার দরকার নেই ViewPager

ViewPager2 অ্যান্ড্রয়েডে একটি নতুন নাম দেখুন উপলব্ধ

উল্লম্ব অভিযোজন সমর্থন

  • ViewPager2প্রথাগত অনুভূমিক পেজিং ছাড়াও উল্লম্ব পেজিং সমর্থন করে। আপনি কোনও ViewPager2উপাদানটির android:orientationবৈশিষ্ট্য নির্ধারণ করে উল্লম্ব পেজিং সক্ষম করতে পারেন

এক্সএমএল ব্যবহার করা হচ্ছে

<androidx.viewpager2.widget.ViewPager2
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:orientation="vertical" />

কোড ব্যবহার করে

viewpager2ব্যবহারে স্যুইপিং অক্ষম করতে

viewPager2.setUserInputEnabled(false);

viewpager2ব্যবহারে স্যুইপিং সক্ষম করতে

viewPager2.setUserInputEnabled(true);

আরও তথ্যের জন্য এটি পরীক্ষা করে দেখুন

হালনাগাদ


3
এটি দুর্দান্ত তবে এখনও অসম্পূর্ণ বলে মনে হচ্ছে। আমি এটি 5 টি পৃথক টুকরো দিয়ে চেষ্টা করেছি এবং পৃষ্ঠাগুলির মধ্যে স্যুইচ করার পরে একটি টুকরো টুকরো টুকরো হয়ে গেছে, যেমন দেখুন না পুনরুদ্ধার করা হয় না আবার
স্ফীতও

@Toochka যে আমার জন্য এটি উত্তম কাজ করছে আপনি এখান থেকে নমুনা কাজ কোড জানতে পারেন শুনে দুঃখিত stackoverflow.com/a/54643817/7666442 সম্ভব হলে আপনার কোড শেয়ার করুন
নিলেশ রাঠোর

1
আমি এই পদ্ধতিটি ব্যবহার করে
ভিউপেজার

1
@ ভঘদেব শুনে শুনে খুশি
নিলেশ

1
@PhaniRithvij এই উত্তর চেক করুন stackoverflow.com/a/54643817/7666442 আমি কিভাবে ব্যবহার করতে সব বিস্তারিত যোগ করা হয়েছে viewpager2সঙ্গেRecyclerView.Adapter
নিলেশ রাঠোর

35

যদি আপনি ভিউপ্যাজার থেকে প্রসারিত করেন তবে আপনার আগে @araks দ্বারা নির্দেশিত অনুযায়ী ওভাররাইড করতে হবেexecuteKeyEvent

@Override
public boolean executeKeyEvent(KeyEvent event)
{
    return isPagingEnabled ? super.executeKeyEvent(event) : false;
}

কারণ গ্যালাক্সি ট্যাব 4 10 'এর মতো কিছু ডিভাইসগুলি এই বোতামগুলি দেখায় যেখানে বেশিরভাগ ডিভাইস সেগুলি কখনই প্রদর্শন করে না:

কীবোর্ড বোতাম


50
স্যামসুং সর্বদা অ্যান্ড্রয়েড ডিভাসের জন্য জিনিসগুলি স্ক্রু করে চলেছে।
toobsco42

2
@ toobsco42 স্যামসং এই ক্ষেত্রে একা নয়। সুইফটকি (জনপ্রিয় কীবোর্ড অ্যাপ্লিকেশন) ব্যবহারকারীদের তাদের কীবোর্ডগুলিতে তীর স্থাপনের অনুমতি দেয়।
সুফিয়ান

1
আপনি যদি নিজের প্যাজারটি পেজ করা থেকে কোনও কীবোর্ড / ট্র্যাকারবল ব্যবহার করে কাউকে থামাতে চান তবে এটিও স্থির।
se22as

28

সোয়াইপ অক্ষম করতে

mViewPager.beginFakeDrag();

সোয়াইপ সক্ষম করতে

mViewPager.endFakeDrag();

22
এটি কোনও ভাল সমাধান নয় কারণ এটি কমপক্ষে আমার অ্যাপ্লিকেশনে ছোট অংশের চলাফেরার অনুমতি দেয়।
কোরাস

আমার জন্য ভাল কাজ করে। প্রদত্ত অন্যান্য সমাধানগুলির তুলনায় অসুবিধাগুলি কী কী?
ব্যবহারকারী এম 1433372

13

আমার একটি নির্দিষ্ট পৃষ্ঠায় সোয়াইপিং অক্ষম করার দরকার ছিল এবং এটি একটি সুন্দর রাবার-ব্যান্ড অ্যানিমেশন দেওয়ার ছিল, এখানে কীভাবে:

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageScrolled(int position, float positionOffset,
                                   int positionOffsetPixels) {
            if (position == MANDATORY_PAGE_LOCATION && positionOffset > 0.5) {
                mViewPager.setCurrentItem(MANDATORY_PAGE_LOCATION, true);
            }
        }

পরবর্তী পৃষ্ঠাটি আংশিকভাবে দৃশ্যমান না হওয়া পর্যন্ত এটি অপেক্ষা করে। পরবর্তী পৃষ্ঠার জন্য একটি কোড onPageSelectedকার্যকর করা হবে। এমনকি পরবর্তী পৃষ্ঠাটি স্যুইচ হবে। সুতরাং, এই কোড প্রয়োজন হয় না।
কুলমাইন্ড

13

আমি জানি এটি পোস্ট করতে খুব দেরী হয়েছে তবে এখানে আপনার ফলাফল অর্জনের জন্য একটি ক্ষুদ্র হ্যাক রয়েছে;)

আপনার ভিউপ্যাজারের নীচে কেবল একটি ডামি ভিউ যুক্ত করুন :

<android.support.v4.view.ViewPager
     android:layout_width="match_parent"
     android:layout_height="match_parent">
</android.support.v4.view.ViewPager>

<RelativeLayout
     android:id="@+id/dummyView"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
</RelativeLayout>

তারপরে OnClickListenerআপনার সাথে একটি যুক্ত করুন RelativeLayout

dummyView = (RelativeLayout) findViewById(R.id.dummyView);

dummyView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
         //Just leave this empty
    }
});

লেআউটগুলি, তাদের বসানো স্থান এবং তাদের আচরণ নিয়ে কিছুটা সৃজনশীল পান এবং আপনি কল্পনা করে একেবারে কিছু করার উপায় খুঁজতে শিখবেন :)

শুভকামনা!


আপনার যদি ইভেন্ট হ্যান্ডেল করার প্রয়োজন না হয় তবে তার setClickableপরিবর্তে একটি সহজ উপায় ব্যবহার করা হয় । setOnClickListeneronClick
বিশৃঙ্খলা

এটি কি ভিউপ্যাজারের মধ্যে থাকা স্পর্শগুলিকে ব্লক করবে না?
অ্যান্ড্রয়েড বিকাশকারী

হ্যা এটা হবে. এটি ওপি @ অ্যান্ড্রয়েড ডেভেলপারের দ্বারা প্রত্যাশিত আচরণের প্রয়োজন
দিনুকা জে

@ রিকগ্রিমস দ্য কোডার আপনি আমার প্রশ্নটি বুঝতে পেরেছেন বলে আমি মনে করি না। আমার অর্থ ভিউপ্যাজারের খণ্ডগুলির মধ্যে থাকা ভিউগুলি। তারা এখনও স্পর্শযোগ্য হতে পারে?
অ্যান্ড্রয়েড বিকাশকারী

না তারা হবেন না যেহেতু ভিউপ্যাজারের নিজেই ক্লিক শ্রোতা রয়েছে। এটি কেবলমাত্র সেই উদাহরণগুলির জন্য উপযুক্ত যেখানে টুকরাগুলির মধ্যে ইন্টারেক্টিভ উপাদান নেই। উদাহরণস্বরূপ একটি ওয়েলকাম ভিউপেজার যা তার টুকরোগুলিকে পরিবর্তনশীলভাবে পরিবর্তন করে @ অ্যান্ড্রয়েড ডেভেলপকারী
দিনুকা জে

12

আমি CustomViewPagerএকটি সোয়াইপিং কন্ট্রোল দিয়ে একটি লিখেছি :

public class ScrollableViewPager extends ViewPager {
    private boolean canScroll = true;
    public ScrollableViewPager(Context context) {
        super(context);
    }
    public ScrollableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public void setCanScroll(boolean canScroll) {
        this.canScroll = canScroll;
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return canScroll && super.onTouchEvent(ev);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return canScroll && super.onInterceptTouchEvent(ev);
    }
}

আপনি সেট করেন তাহলে canScrollথেকে true, এই ViewPagerআঙুল দিয়ে সোয়াইপ করা যেতে পারে, falseবিপরীত।

আমি আমার প্রকল্পে এটি ব্যবহার করি এবং এটি এখন অবধি দুর্দান্ত কাজ করে।


1
ভিউপ্যাজারের ভিতরে যদি আমার একটি বোতাম থাকে এবং আমি ক্লিকটি চাই? এই সমাধানটি ভিউপ্যাজারের নীচে থাকা সমস্ত কিছুকে ক্লিক করা বন্ধ করে দেয় ..
লক্ষ্যটিও

6

আমি এই শ্রেণিটি সাফল্যের সাথে ব্যবহার করেছি। উপেক্ষা করা executeKeyEvent কিছু ডিভাইস অথবা ব্যবহারের জন্য তীরচিহ্নগুলি ব্যবহার swiping এড়াতে প্রয়োজন বোধ করা হয়:

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;

public class ViewPagerNoSwipe extends ViewPager {
    /**
     * Is swipe enabled
     */
    private boolean enabled;

    public ViewPagerNoSwipe(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.enabled = false; // By default swiping is disabled
    }

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

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

    @Override
    public boolean executeKeyEvent(KeyEvent event) {
        return this.enabled ? super.executeKeyEvent(event) : false;
    }

    public void setSwipeEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}

এবং এক্সএমএল এ এটি কল করুন:

<package.path.ViewPagerNoSwipe
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

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

5

কোটলিনে, আমার সমাধান, উপরের উত্তরগুলির সংমিশ্রণে।

class CustomViewPager(context: Context, attrs: AttributeSet): ViewPager(context, attrs) {
    var swipeEnabled = false

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        return if (swipeEnabled) super.onTouchEvent(ev) else false
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return if (swipeEnabled) super.onInterceptTouchEvent(ev) else false
    }

    override fun executeKeyEvent(event: KeyEvent): Boolean {
        return if (swipeEnabled) super.executeKeyEvent(event) else false
    }
}

ওভাররাইডিং onInterceptTouchEvent()শিশুদের দর্শনগুলি ইনপুট পেতে বাধা দেবে। বেশিরভাগ ক্ষেত্রে এটি উদ্দেশ্যমূলক আচরণ নয়।
অ্যালেক্স সেমেনিয়ুক

আমি প্রতিটি খণ্ডের শিশু দৃষ্টিভঙ্গির সাথে ইন্টারেক্ট করতে সক্ষম হয়েছি। আপনি কী উল্লেখ করছেন তা নিশ্চিত নন।
জেফ প্যাজেট

5

কোটলিনে, আমরা ভিউপাগার বর্গ উত্তরাধিকার সূত্রে একটি কাস্টম উইজেট তৈরি করে এবং সোয়াইপ আচরণ নিয়ন্ত্রণের জন্য একটি পতাকা মান যুক্ত করে এটি সমাধান করতে পারি।

NoSwipePager.kt

class NoSwipePager(context: Context, attrs: AttributeSet) : ViewPager(context, attrs) {

    var pagingEnabled: Boolean = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        return if (this.pagingEnabled) {
            super.onTouchEvent(event)
        } else false
    }

    override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
        return if (this.pagingEnabled) {
            super.onInterceptTouchEvent(event)
        } else false
    }
}

এক্সএমএলে

<your.package.NoSwipePager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/tab_layout" />

প্রোগ্রামে সোয়াইপিং অক্ষম করুন। যদি kotlin-android-extensionsপ্লাগইনটি বিল্ডড্র্যাডলে প্রয়োগ করা হয় তবে কোডের নীচে লিখে সোয়াইপিং অক্ষম করা যেতে পারে।

view_pager.pagingEnabled = false

অন্যথায় আমরা নীচের কোড ব্যবহার করে সোয়াইপিং অক্ষম করতে পারি:

val viewPager : ViewPager = findViewById(R.id.view_pager)
viewPager.pagingEnabled = false

ওভাররাইডিং onInterceptTouchEvent()শিশুদের দর্শনগুলি ইনপুট পেতে বাধা দেবে। অধিকাংশ ক্ষেত্রে এই হল না দেয়ার উদ্দেশ্যে আচরণ।
অ্যালেক্স Semeniuk

@ অ্যালেক্সসেমিনুক এটি প্রয়োগের পরে আপনি কি কোনও সমস্যা লক্ষ্য করেছেন? আমি কিছু ক্রিয়াকলাপের জন্য পুনর্ব্যবহারযোগ্য ভিউ আইটেমগুলিতে স্যুইপিং সক্ষম করেছিলাম এবং এটি ভাল কাজ করছে। সুতরাং বাস্তবায়ন আমার ক্ষেত্রে ভাল কাজ করছে।
সাগর চাঁপাগেইন

সাগর চাপাগেইন: বা অবশ্যই, আমি করেছি। আমার প্রতিটি পৃষ্ঠায় কাস্টম ভিউ রয়েছে, যা বিভিন্ন উপায়ে স্পর্শ করে (স্ক্রোলিং, টেনে নিয়ে যাওয়া, একক এবং দীর্ঘ ট্যাপ সহ)। super.onInterceptTouchEvent(event)এই মতামতগুলির ফলাফলগুলি কল না করা কোনও ইনপুট না পেয়ে (যা onInterceptTouchEventপদ্ধতির ডকুমেন্টেড উদ্দেশ্য )।
অ্যালেক্স Semeniuk

যদি এটি হয় তবে আপনার পরিবর্তে শিশু খণ্ড ব্যবহার করা উচিত এবং ব্যাকস্ট্যাকটি বজায় রাখা উচিত।
সাগর চাঁপাগেইন

এটি বর্তমান প্রশ্নের সাথে কীভাবে প্রাসঙ্গিক? টুকরাগুলি কিছু ধারক (যা দেখায় ) এর ভিতরে স্থাপন করা হয় এবং তাদের নিজস্ব লেআউটে ভিউ রয়েছে । ভিউপ্যাজারের ভিতরে আমার কাছে যে বিষয়বস্তু রয়েছে তা নির্বিশেষে আমি এখনও কাজ করছি যে ওভাররাইডিং onInterceptTouchEvent()পদ্ধতিটি (সামগ্রী) ইনপুট পেতে বাধা দেয়।
অ্যালেক্স Semeniuk

4

অনারসেপ্ট টাচ এভেন্ট () এবং / অথবা অন টাচএভেন্ট () থেকে যে কোনওটি ওভাররাইডিং এবং সত্যটি ফিরে আসার চেষ্টা করুন , যা পেজারে স্পর্শ ইভেন্টগুলি গ্রাস করবে।


1
তিনি trueকি স্পর্শ ইভেন্টটি পরিচালিত হয়েছে তা বোঝাতে ফিরে আসতে চান না ?
এডিথার্ড

1

নির্দিষ্ট পৃষ্ঠায় সোয়াইপিং অক্ষম করার জন্য আরও একটি সহজ সমাধান (উদাহরণস্বরূপ, পৃষ্ঠা 2):

int PAGE = 2;
viewPager.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
        if (viewPager.getCurrentItem() == PAGE) {
                viewPager.setCurrentItem(PAGE-1, false);
                viewPager.setCurrentItem(PAGE, false);
                return  true;
        }
        return false;
}

1
This worked for me

viewPager.setOnTouchListener(new View.OnTouchListener() {
                                         @Override
                                         public boolean onTouch(View v, MotionEvent event) {
                                             if (viewPager.getCurrentItem() == 0) {
                                                 viewPager.setCurrentItem(-1, false);
                                                 return true;
                                             }
                                             else if (viewPager.getCurrentItem() == 1) {
                                                 viewPager.setCurrentItem(1, false);
                                                 return true;
                                             }
                                             else if (viewPager.getCurrentItem() == 2) {
                                                 viewPager.setCurrentItem(2, false);
                                                 return true;
                                             }
                                             return true;
                                         }
                                     });

1

আপনি যদি ImageViewও এর সাথে একটি চিত্র গ্যালারী লিখেন ViewPagerযা জুম এবং প্যানকে সমর্থন করে, এখানে বর্ণিত একটি সাধারণ সমাধান দেখুন: ফিম্প্ম অ্যান্ড্রয়েডে ডিফল্ট ভিউপেজার বাড়িয়ে (এবং গিথুব নমুনা - ফটোভিউ ) একটি চিড়িয়াখানাযোগ্য চিত্রকল্পটি বাস্তবায়ন । এই সমাধানটি ViewPagerএকা নিয়ে কাজ করে না ।

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

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        try {
            return super.onInterceptTouchEvent(event);
        } catch (IllegalArgumentException e) {
            return false;
        }
    }
}

0

আপনি যদি জামারিনে অ্যান্ড্রয়েডের জন্য একই বাস্তবায়ন করতে চান তবে এখানে সি # তে একটি অনুবাদ রয়েছে

আমি " স্ক্রোলএনেবলড " বৈশিষ্ট্যটির নাম চয়ন করেছি । কারণ আইওএস কেবল এক্সেটটি একই নাম ব্যবহার করে। সুতরাং, উভয় প্ল্যাটফর্ম জুড়ে আপনার সমান নামকরণ রয়েছে, এটি বিকাশকারীদের পক্ষে সহজ করে তোলে।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Support.V4.View;
using Android.Util;

namespace YourNameSpace.ViewPackage {

    // Need to disable swiping for ViewPager, if user performs Pre DSA and the dsa is not completed yet
    // http://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s
    public class CustomViewPager: ViewPager {
        public bool ScrollEnabled;

        public CustomViewPager(Context context, IAttributeSet attrs) : base(context, attrs) {
            this.ScrollEnabled = true;
        }

        public override bool OnTouchEvent(MotionEvent e) {
            if (this.ScrollEnabled) {
                return base.OnTouchEvent(e);
            }
            return false;
        }

        public override bool OnInterceptTouchEvent(MotionEvent e) {
            if (this.ScrollEnabled) {
                return base.OnInterceptTouchEvent(e);
            }
            return false;
        }

        // For ViewPager inside another ViewPager
        public override bool CanScrollHorizontally(int direction) {
            return this.ScrollEnabled && base.CanScrollHorizontally(direction);
        }

        // Some devices like the Galaxy Tab 4 10' show swipe buttons where most devices never show them
        // So, you could still swipe through the ViewPager with your keyboard keys
        public override bool ExecuteKeyEvent(KeyEvent evt) {
            return this.ScrollEnabled ? base.ExecuteKeyEvent(evt) : false;
        }
    }
}

.Axml ফাইলটিতে:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <YourNameSpace.ViewPackage.CustomViewPager
      android:id="@+id/pager"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:background="@android:color/white"
      android:layout_alignParentTop="true" />
</LinearLayout>

0

উপরের কোডগুলির কোনওটিই সাবলীলভাবে কাজ করছে না i আমি এটি চেষ্টা করেছি

<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/pager"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </HorizontalScrollView>

0

এখানে আমার বাস্তবায়ন
যে আপনি যদি সোয়াইপ অ্যানিমেশনটি অক্ষম করতে চান তবে আপনি বাম এবং ডানদিকে সোয়াইপলিস্টনার ব্যবহার করতে পারেন এবং তবুও আঙুল দিয়ে স্ক্রোলটি চান তবে অ্যানিমেশন ছাড়াই

1-ওভাররাইড Viewpagerপদ্ধতি onInterceptTouchEventএবংonTouchEvent

2- আপনার নিজের তৈরি করুন GestureDetector

3- সোয়াইপ অঙ্গভঙ্গি সনাক্ত করুন এবং ব্যবহার করুন setCurrentItem(item, false)

ViewPager

public class ViewPagerNoSwipe extends ViewPager {
    private final GestureDetector gestureDetector;
    private OnSwipeListener mOnSwipeListener;

    public void setOnSwipeListener(OnSwipeListener onSwipeListener) {
        mOnSwipeListener = onSwipeListener;
    }

    public ViewPagerNoSwipe(@NonNull Context context) {
        super(context);
        gestureDetector = new GestureDetector(context, new GestureListener());

    }

    public ViewPagerNoSwipe(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        gestureDetector = new GestureDetector(context, new GestureListener());


    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return true;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        gestureDetector.onTouchEvent(ev);
        return false;
    }

    public class GestureListener extends GestureDetector.SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            if(mOnSwipeListener!=null)
                            mOnSwipeListener.onSwipeRight();
                        } else {
                            if(mOnSwipeListener!=null)
                                mOnSwipeListener.onSwipeLeft();
                        }
                        result = true;
                    }
                } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        if(mOnSwipeListener!=null)
                            mOnSwipeListener.onSwipeBottom();
                    } else {
                        if(mOnSwipeListener!=null)
                            mOnSwipeListener.onSwipeTop();
                    }
                    result = true;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public interface OnSwipeListener {

         void onSwipeRight();

        void onSwipeLeft();

        void onSwipeTop();

        void onSwipeBottom();
    }
}

আপনি যখন ভিউপেজার সেট আপ করবেন তখন সোয়াইপলিস্টনার সেট করুন

postsPager.setOnSwipeListener(new ViewPagerNoSwipe.OnSwipeListener() {
            @Override
            public void onSwipeRight() {

              postsPager.setCurrentItem(postsPager.getCurrentItem() + 1,false);

            }

            @Override
            public void onSwipeLeft() {

            postsPager.setCurrentItem(postsPager.getCurrentItem() - 1, false);

            }
             ...
           }

0

আমি কেবলমাত্র ভিউপাগারটিকে কিছুটা কাস্টমাইজ করেছি এবং সহজেই সোয়াইপিং অক্ষম করি।

public class CustomViewPager extends ViewPager {

private boolean swipeLocked;

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

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

public boolean getSwipeLocked() {
    return swipeLocked;
}

public void setSwipeLocked(boolean swipeLocked) {
    this.swipeLocked = swipeLocked;
}

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

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

@Override
public boolean canScrollHorizontally(int direction) {
    return !swipeLocked && super.canScrollHorizontally(direction);
}
}

0

আপনি যদি ভিউপেজার 2 ব্যবহার করছেন তবে আপনাকে কেবল ব্যবহার করতে হবে:

viewpager.setUserInputEnabled(false);

ডক্স থেকে :

ব্যবহারকারী আরম্ভ করা স্ক্রোলিং সক্ষম বা অক্ষম করুন। এর মধ্যে রয়েছে টাচ ইনপুট (স্ক্রোল এবং ভঙ্গি অঙ্গভঙ্গি) এবং অ্যাক্সেসিবিলিটি ইনপুট। কীবোর্ড ইনপুট অক্ষম করা এখনও সমর্থিত নয়। যখন ব্যবহারকারী আরম্ভ করা স্ক্রোলিং অক্ষম করা থাকে, সেটকর্ন্টআইটেমের মাধ্যমে প্রোগ্রাম্যাটিক স্ক্রোলগুলি এখনও কাজ করে। ডিফল্টরূপে, ব্যবহারকারী সূচিত স্ক্রোলিং সক্ষম করে।

ধন্যবাদ: https://stackoverflow.com/a/61685871/9026710


-1
shareViewPager?.setOnTouchListener(object :View.OnTouchListener{
            override fun onTouch(v: View?, event: MotionEvent?): Boolean {
                for (PAGE in 0..shareViewPager.adapter!!.count){
                    if (shareViewPager.currentItem==PAGE){
                        shareViewPager.setCurrentItem(PAGE-1,false)
                        shareViewPager.setCurrentItem(PAGE,false)
                    }}
                return true
            }

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