Android에서 뷰 페이저 스 와이프를 비활성화하거나 활성화하는 방법


78

내가하려는 작업 : 프로그램이 실행 중일 때 프로그래밍 방식으로 호출기에서 스 와이프를 활성화 / 비활성화하려고합니다.

예 : 흐름에있을 때 조건을 확인하고 반환true하면 스 와이프가활성화되고 조건이 반환되면false스 와이프를 비활성화합니다.


내가 사용하고있는 해결책은 이것입니다

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

그런 다음 XML의 내장 뷰 페이지 대신 이것을 선택하십시오.

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

"false"로 "setPagingEnabled"메소드를 호출하기 만하면 사용자는 스 와이프하여 페이지를 매길 수 없습니다.


위의 방법론의 문제 : 흐름에 속성을 설정할 수 없습니다 . 즉, .... 스 와이프를 활성화하거나 비활성화 할 수 있습니다. 하지만 조건에 따라 할 수 없습니다


질문:

  1. 다른 방법으로 내 목표를 달성 할 수 있습니까? 그렇다면 그것은 무엇입니까?
  2. 아니면 이것이 가능하지 않습니까?


DataBinding을 사용하여 흐름에 속성을 설정할 수 없습니까?
oldergod

답변:


62

프로그래밍 방식으로 스 와이프 비활성화

    final View touchView = findViewById(R.id.Pager); 
    touchView.setOnTouchListener(new View.OnTouchListener() 
    {         
        @Override
        public boolean onTouch(View v, MotionEvent event)
        { 
           return true; 
        }
     });

이것을 사용하여 수동으로 스 와이프합니다.

touchView.setCurrentItem(int index);

55
그래도 뷰 페이저가 멈추기 전에 부분적으로 스 와이프 (예 : 1 %) 할 수 있습니다. 못 생겼어.
IgorGanapolsky 2015 년

8
그의 솔루션은 작동하지만 불완전합니다. 또한 onInterceptTouchEvent (MotionEvent event)도 재정의해야합니다. 이것은 당신에게 당신이 1 %없이 원하는 모양 줄 것이다
portfoliobuilder

2
메소드 오버라이드 (override)하는 수 없습니다
Animesh 망 글라 (Mangla)

그것은 작동하지만이 활성화되면, 스 와이프는 아주 나쁜 느린입니다
faeze saghafi

5
이것은 절대적으로 잘못된 해결책입니다. 왜 별이 그렇게 많은지. 1 %의 스 와이프로 정말보기 흉해 보입니다. 아마, 우리는 viewpager, 확장, onInterceptTouchEvent 오버라이드 (override) 할 필요가
안톤 Kizema

75

나를위한 최고의 솔루션. -먼저 다음과 같은 클래스를 만듭니다.

public class CustomViewPager extends ViewPager {
  private Boolean disable = false;
  public CustomViewPager(Context context) {
      super(context);
  }
  public CustomViewPager(Context context, AttributeSet attrs){
      super(context,attrs);
  }
  @Override
  public boolean onInterceptTouchEvent(MotionEvent event) {
     return !disable && super.onInterceptTouchEvent(event);
  }

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

  public void disableScroll(Boolean disable){
      //When disable = true not work the scroll and when disble = false work the scroll
      this.disable = disable;
  }
}

레이아웃이 변경 - 그런 : <android.support.v4.view.ViewPager 이것에 대한<com.mypackage.CustomViewPager

-마지막으로 비활성화 view_pager.disableScroll(true); 하거나 활성화 할 수 있습니다.view_pager.disableScroll(false);

도움이 되었기를 바랍니다. :)


Thanx Alberto :)
Praveen Kumar Verma

1
또한 스크롤링 비활성화 메서드를 호출 한 후 viewPager.invalidate () 메서드 를 호출하는 것을 잊지 마십시오 . 즉시 스 와이프를 비활성화하기 때문입니다.
Ritesh Adulkar

이 솔루션을 사용하면 ViewPager 내부의 뷰가 disable == true. 재정의 onInterceptTouchEvent()는 올바른 해결책이 아닙니다.
Alex Semeniuk

부울 대신 여기에 부울을 사용하고 싶습니다.
hgoebl

감사. 귀하의 답변은 작업 기능을 개선하는 데 도움이되었습니다.
AndyN

19

사용자 정의보기 호출기 어댑터에서 ViewPager.

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

활성화하려면 각 super메서드를 반환하십시오 .

super.onInterceptTouchEvent(event)super.onTouchEvent(event).


4

스 와이프 비활성화

mViewPager.beginFakeDrag();

스 와이프 사용

if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();



u pls는 당신의 질의를 정교하게 할 수 있습니까?
Sanjay Bhalani

이 솔루션을 사용하려고하지만 endFakeDrag를 호출 할 때 NullPointerException이 발생합니다.
Mia

다음과 같은 조건을 사용하십시오. if (mViewPager.isFakeDragging ()) mViewPager.endFakeDrag ();
Sanjay Bhalani

3

제 경우에는 단순화 된 솔루션이 잘 작동했습니다. 재정의 메서드는 TouchEvent 리스너를 재정의하고 고정되도록 사용자 정의 뷰 페이지 어댑터에 있어야합니다.

@Override
public boolean onTouchEvent(MotionEvent event) {
    return this.enabled && super.onTouchEvent(event);

}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return this.enabled && super.onInterceptTouchEvent(event);

}

제공되는 솔루션에 대해 설명 제공
인 Anantha 라주 C

1
@AnanthaRajuC는 :) 제공
에릭

이 솔루션을 사용하면 ViewPager 내부의 뷰가 this.enabled == false. 재정의 onInterceptTouchEvent()는 올바른 해결책이 아닙니다.
Alex Semeniuk


1

이것은 나를 위해 일했습니다.

   ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            // disable swipe
            if(!swipeEnabled) {
                if (viewPager.getAdapter().getCount()>1) {
                    viewPager.setCurrentItem(1);
                    viewPager.setCurrentItem(0);
                }
            }
        }
        public void onPageScrollStateChanged(int state) {}
        public void onPageSelected(int position) {}
    };
    viewPager.addOnPageChangeListener(onPageChangeListener);

1

Not-Swipeable 동작이 필요하기 때문에 확장하려는 경우에는 수행 할 필요가 없습니다. ViewPager2는 다음과 같은 멋진 속성을 제공합니다.isUserInputEnabled

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.