답변:
간단한 해결책은 플래그 ViewPager
가있는 자체 하위 클래스를 만드는 것 입니다. 그런 다음 and 메소드를 대체하십시오 . 경우 인보 진정한 동일 그렇지 않으면, 방법 .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>
태그 로 바꿉니다.
이 코드는이 블로그 게시물 에서 수정되었습니다 .
이것에 대한 쉬운 수정이 있습니다 :
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()
.
onInterceptTouchEvent()
하면 자식 뷰가 입력을받지 못하게됩니다. 대부분의 경우 이것은 의도 된 동작 이 아닙니다 .
간단한 해결책을 찾았습니다.
//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
방법을 사용 하여 페이지를 변경할 수 있습니다 .
canScrollHorizontally()
방법은 현재 시나리오에는 영향을 미치지 않습니다. 스 와이프가 발생해도 호출되지 않습니다.
다음은 Kotlin과 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)
}
}
이 방법에 대해 :
내가 사용 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);
}
}
}
View.scrollTo(int x, int y)
하면이 문제가 해결되었습니다. 감사합니다
ViewPager 2 alpha 2를 사용하는 경우 아래 스 니펫이 작동합니다.
viewPager.isUserInputEnabled = false
사용자 입력을 비활성화하는 기능 (setUserInputEnabled, isUserInputEnabled)
viewpager2 1.0.0-alpha02의 더 많은 변경 사항은 이것을 참조하십시오
또한 일부 변경 사항이 최신 버전이었습니다 ViewPager 2 alpha 4
orientation 및 isUserScrollable 속성이 더 이상 SavedState의 일부가 아닙니다.
viewpager2 # 1.0.0-alpha04의 더 많은 변경 사항은 이것을 참조하십시오
Slayton의 대답은 잘 작동합니다. 원숭이처럼 쓸어 넘기지 않으려면 OnPageChangeListener를 재정 의하여
@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;
}
}
나란히 스 와이프 할 수 있습니다
setPagingEnabled()
방법이 무엇인지 확실 하지 않습니다. 완전한 코드를 포함하십시오.
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 --- 태그로 바꿉니다.