it-swarm-id.com

Apakah mungkin untuk menonaktifkan pengguliran pada ViewPager

Saya punya ViewPager yang instantiates View. Saya ingin menonaktifkan penggulir viewpager dan tombol anak untuk sementara waktu sementara hasil pencarian dikembalikan ke tampilan. Saya sudah memanggil viewPager.setEnabled(false) tetapi ini tidak menonaktifkannya. 

Ada yang punya ide? 

121
mAndroid

Solusi sederhana adalah membuat subclass Anda sendiri dari ViewPager yang memiliki flag private boolean, isPagingEnabled. Kemudian ganti metode onTouchEvent dan onInterceptTouchEvent. Jika isPagingEnabled sama dengan benar memanggil metode super, sebaliknya 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;
    }
}

Kemudian dalam file Layout.XML Anda, ganti tag <com.Android.support.V4.ViewPager> apa pun dengan tag <com.yourpackage.CustomViewPager> Anda.

Kode ini diadaptasi dari posting blog ini

329
slayton

Ada perbaikan yang mudah untuk ini:

Ketika Anda ingin menonaktifkan scroll viewpager maka:

mViewPager.setOnTouchListener(new OnTouchListener() {

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

Dan saat Anda ingin mengembalikan eanble, maka:

mViewPager.setOnTouchListener(null);

Itu akan melakukan triknya.

30
Akhil Sekharan

Inilah varian ringan dari jawaban slayton saya:

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

Dengan kode saya, Anda dapat menonaktifkan paging dengan setEnable().

28
rekire

Saya menemukan solusi sederhana.

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();
20
Yessy

Saya menyarankan cara lain untuk mengatasi masalah ini. Idenya adalah membungkus viewPager Anda dengan scrollView, sehingga ketika scrollView ini tidak dapat digulir, viewPager Anda juga tidak dapat digulir.

Berikut ini adalah tata letak XML saya:

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

Tidak diperlukan kode.

Bekerja dengan baik untuk saya.

7
M. Marmor

Untuk menonaktifkan geser

 mViewPager.beginFakeDrag();

Untuk mengaktifkan gesek

 mViewPager.endFakeDrag();
5
Isaias Carrera

Solusi terbaik yang bekerja untuk saya adalah:

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

Setelah ini gulir akan dinonaktifkan dengan sentuhan dan kemudian Anda masih dapat menggunakan metode setCurrentItem untuk mengubah halaman.

Bagaimana dengan ini : 
Saya menggunakan CustomViewPager 
dan selanjutnya, ganti metode scrollTo
Saya memeriksa gerakan ketika melakukan banyak gesekan kecil, itu tidak bergulir ke halaman lain.

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);
       }
    }
}
3
godbye

Jawaban slayton bekerja dengan baik. Jika Anda ingin berhenti menggesekkan seperti monyet, Anda dapat mengganti OnPageChangeListener dengan 

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

Jadi Anda hanya bisa menggesek berdampingan

1
Informatic0re

Saat Anda menggunakan jawaban di atas, Anda mungkin menghadapi pertanyaan buruk: "set isScrollEnabled false, beberapa tampilan dalam viewPager ini tidak dapat menangani onClick & onTouchEvent. Jadi saya memberikan solusi, harap ini dapat membantu Anda ... 

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

    var isScrollEnabled = true

    override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
        if(isScrollEnabled){ 
             super.onInterceptTouchEvent(event) 
         }else{
            return isScrollEnabled && super.onInterceptTouchEvent(event)
         }
    }
    override fun onTouchEvent(event: MotionEvent?): Boolean {
        if(isScrollEnabled){
             return isScrollEnabled
         }else{
             return isScrollEnabled  && super.onTouchEvent(event)
        }
    }
}
0
BertKing
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*/);
    }
}
}

Kemudian dalam file Layout.XML Anda ganti tag --- com.Android.sup.V4.ViewPager ---.__ dengan tag --- com.yourpackage.NonSwipeableViewPager ---.

0

Meng-override hanya onTouchEvent dan onInterceptTouchEvent tidak cukup jika Anda memiliki ViewPager itu sendiri di dalam ViewPager lain.

Child ViewPager akan membuat peristiwa sentuh gulir horizontal dari ViewPager induk kecuali jika diposisikan pada halaman pertama/terakhir.

Lihat lebih banyak di ini SO jawaban

0
sidon

Inilah jawaban di Kotlin dan 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)
    }
}
0
Pasi Matalamäki