web-dev-qa-db-ja.com

androidでビューページャーのスワイプを無効または有効にする方法

私がやろうとしていること:プログラムの実行中にプログラムでページャーのスワイプを有効/無効にしようとしています

Ex:フロー上で条件を確認し、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" />

「setPagingEnabled」メソッドを「false」で呼び出すだけで、ユーザーはページをめくるようにスワイプできなくなります。


上記の方法論の問題:フローのプロパティを設定できません。I:e ....スワイプを有効または無効にできます。しかし、私は条件に基づいてこれを行うことはできません


質問:

  1. 他の方法で目標を達成できますか?
  2. それとも不可能ですか?
68
Devrath

プログラムによるスワイプを無効にする-

    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);
54
Ajeet

私にとって最適なソリューション。 -まず、次のようなクラスを作成します。

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 for this<com.mypackage.CustomViewPager

-最後に、無効にすることができます:view_pager.disableScroll(true);または有効にする:view_pager.disableScroll(false);

これがあなたのお役に立てば幸いです:)

51
Alberto

カスタムビューページャーアダプターで、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)

18

スワイプを無効にするため

mViewPager.beginFakeDrag();

スワイプを有効にする

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

2
Sanjay Bhalani

私の場合、簡素化されたソリューションは問題なく機能しました。 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);

}
2
TheTeslaa

私はこのリンクに従って私のために働いた別の解決策を見つけました

https://stackoverflow.com/a/42687397/4559365

基本的に、メソッドcanScrollHorizontallyをオーバーライドして、指によるスワイプを無効にします。ただし、setCurrentItemは引き続き機能します。

これは私のために働いた。

   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