私がやろうとしていること:プログラムの実行中にプログラムでページャーのスワイプを有効/無効にしようとしています
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 ....スワイプを有効または無効にできます。しかし、私は条件に基づいてこれを行うことはできません
プログラムによるスワイプを無効にする-
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);
私にとって最適なソリューション。 -まず、次のようなクラスを作成します。
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);
これがあなたのお役に立てば幸いです:)
カスタムビューページャーアダプターで、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)
。
スワイプを無効にするため
mViewPager.beginFakeDrag();
スワイプを有効にする
if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();
私の場合、簡素化されたソリューションは問題なく機能しました。 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);
}
私はこのリンクに従って私のために働いた別の解決策を見つけました
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);