web-dev-qa-db-fra.com

Comment désactiver ou activer le balayage de viewpager dans android

Ce que j'essaie de faire: J'essaie d'activer/de désactiver le balayage dans un programme de pagination lorsque le programme est en cours d'exécution

Ex: Lorsque vous êtes sur le flot, si je vérifie la présence d'une condition et si elle retourne true activer le balayage, et si la condition retourne false désactiver le balayage.


La solution que j'utilise est celle-ci

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

Ensuite, sélectionnez ceci au lieu du viewpager intégré en XML

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

Il vous suffit d'appeler la méthode "setPagingEnabled" avec "false" et les utilisateurs ne pourront pas glisser pour effectuer une pagination.


Problème avec la méthodologie ci-dessus: Je ne peux pas définir la propriété sur le flux, I: e .... Je peux soit activer le balayage, soit le désactiver. Mais je ne peux pas faire cela à condition


Question:

  1. Puis-je atteindre mon objectif d'une autre manière, si c'est le cas?
  2. Ou n'est-ce pas possible?
68
Devrath

Désactiver le balayage par programme de -

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

et l'utiliser pour balayer manuellement

touchView.setCurrentItem(int index);
54
Ajeet

La meilleure solution pour moi. -Tout d'abord, vous créez une classe comme celle-ci:

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

-Alors changez ceci dans votre layout: <Android.support.v4.view.ViewPager pour this<com.mypackage.CustomViewPager

-Enfin, vous pouvez le désactiver: view_pager.disableScroll(true); ou l'activer: view_pager.disableScroll(false);

J'espère que cela vous aide :)

51
Alberto

Dans votre adaptateur de vue personnalisée, remplacez ces méthodes dans 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;
}

Et pour l'activer, il suffit de renvoyer chaque méthode super:

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

18
Florescu Cătălin

Pour désactiver le balayage

mViewPager.beginFakeDrag();

Pour activer le glissement

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

2
Sanjay Bhalani

Dans mon cas, la solution simplifiée a bien fonctionné. La méthode de remplacement doit figurer dans votre adaptateur de viewpager personnalisé pour pouvoir remplacer les écouteurs TouchEvent et make'em freeze.

@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

J'ai trouvé une autre solution qui a fonctionné pour moi suivre ce lien

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

En gros, il remplace la méthode canScrollHorizontally pour désactiver le balayage par doigt. Quoi qu'il en soit setCurrentItem fonctionne toujours.

Cela a fonctionné pour moi.

   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