Programing

ViewPager에서 스크롤을 비활성화 할 수 있습니까?

lottogame 2020. 6. 29. 08:02
반응형

ViewPager에서 스크롤을 비활성화 할 수 있습니까?


나는이 ViewPager을 인스턴스화하는가 View. 검색 결과가보기로 반환되는 동안 뷰 페이저와 자식 버튼의 스크롤을 일시적으로 비활성화하고 싶습니다. 전화를 걸 viewPager.setEnabled(false)었지만 비활성화하지는 않습니다.

누구든지 아이디어가 있습니까?


간단한 해결책은 플래그 ViewPager가있는 자체 하위 클래스를 만드는 것 입니다. 그런 다음 and 메소드를 대체하십시오 . 경우 인보 진정한 동일 그렇지 않으면, 방법 .private booleanisPagingEnabledonTouchEventonInterceptTouchEventisPagingEnabledsuperreturn

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>태그 바꿉니다.

이 코드는이 블로그 게시물 에서 수정되었습니다 .


이것에 대한 쉬운 수정이 있습니다 :

viewpager 스크롤을 비활성화하려면 다음을 수행하십시오.

mViewPager.setOnTouchListener(new OnTouchListener() {

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

그리고 당신이 그것을 다시 원할 때 :

mViewPager.setOnTouchListener(null);

그 트릭을 할 것입니다.


다음은 slayton의 대답에 대한 경량 변형입니다.

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().


간단한 해결책을 찾았습니다.

//disable swiping
mViewPager.beginFakeDrag();

//enable swiping
mViewPager.endFakeDrag();

이 문제를 해결하는 다른 방법을 제안합니다. 아이디어는 viewPager를 scrollView로 래핑 하므로이 scrollView를 스크롤 할 수 없을 때 viewPager도 스크롤 할 수 없습니다.

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

코드가 필요하지 않습니다.

나를 위해 잘 작동합니다.


스 와이프를 비활성화하려면

 mViewPager.beginFakeDrag();

스 와이프를 사용하려면

 mViewPager.endFakeDrag();

나를 위해 일한 가장 좋은 해결책은 다음과 같습니다.

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방법을 사용 하여 페이지를 변경할 수 있습니다 .


이 방법에 대해 :
내가 사용 CustomViewPager
하고 다음, scrollTo 방법 오버라이드 (override)
작은 와이프를 많이 할 때 나는 움직임을 확인, 다른 페이지로 이동하지 않습니다.

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

Here's an answer in Kotlin and 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)
    }
}

The answer of slayton works fine. If you want to stop swiping like a monkey you can override a OnPageChangeListener with

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

So you can only swipe side by side


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

Then in your Layout.XML file replace any --- com.android.support.V4.ViewPager --- tags with --- com.yourpackage.NonSwipeableViewPager --- tags.


New class ViewPager2 from androidx allows to disable scrolling with method setUserInputEnabled(false)

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

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

참고URL : https://stackoverflow.com/questions/7814017/is-it-possible-to-disable-scrolling-on-a-viewpager

반응형