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.
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
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);
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 :)
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)
.
Pour désactiver le balayage
mViewPager.beginFakeDrag();
Pour activer le glissement
if (mViewPager.isFakeDragging()) mViewPager.endFakeDrag();
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);
}
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);