56 votes

onClick sur ViewPager non déclenché

J'ai défini un écouteur de clic sur un ViewPager , mais l'événement onClick n'est jamais appelé. J'imagine que la détection des événements tactiles du ViewPager interfère, mais je ne vois pas comment le résoudre.

Quelqu'un pourrait aider?

Merci

 mViewPager.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // never called
    }
}); 
 

105voto

Martin Christmann Points 1098

J'ai résolu un problème similaire en utilisant un GestureDetector

Envoi de MotionEvent au GestureDetector

 tapGestureDetector = new GestureDetector(this, new TapGestureListener());

viewPager.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            tapGestureDetector.onTouchEvent(event);
            return false;
        }
});
 

Si vous utilisez la bibliothèque de compatibilité, vous pouvez modifier la première ligne en:

 tapGestureDetector = new GestureDetectorCompat(this, new TapGestureListener());
 

Vous pouvez gérer votre événement dans GestureListener:

         class TapGestureListener extends GestureDetector.SimpleOnGestureListener{

         @Override
         public boolean onSingleTapConfirmed(MotionEvent e) {
           // Your Code here
         }
        }
 

21voto

Kalpesh Points 593

J'ai fait comme ça ...

 mViewPager.setOnTouchListener(new View.OnTouchListener() {
    float oldX = 0, newX = 0, sens = 5;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            oldX = event.getX();
            break;

        case MotionEvent.ACTION_UP:
            newX = event.getX();
            if (Math.abs(oldX - newX) < sens) {
                itemClicked(mViewPager.getCurrentItem());
                return true;
            }
            oldX = 0;
            newX = 0;
            break;
        }

        return false;
    }
});
 

20voto

bhekman Points 993

En effet, le viewpager est interférents. Mais vous pouvez remplacer les méthodes de la viewpager pour lui faire faire ce que vous voulez. Vous aurez besoin de remplacer le ViewGroup.onInterceptTouchEvent(MotionEvent ev) de la méthode.

Vous pourrait toujours retourner false pour permettre à l'événement de touche de tomber à travers. Je vous recommande aussi un appel à super.onInterceptTouchEvent(ev) pour permettre le passage des doigts de continuer à travailler.

Elle passe dans un MotionEvent, de sorte que vous pouvez vérifier pour les clics avec que si vous vouliez.

Espérons que cela aide. Il devrait au moins obtenir vous avez commencé. Post de retour avec des questions ou d'autres problèmes.

EDIT:

Notez également que le ViewPager ne mange pas de clics. Par conséquent, vous pouvez facilement configurer une onclicklistener sur n'importe quel ou tous les enfants de la viewpager si vous voulais capturer clics et potentiellement vous sauver beaucoup de travail.

5voto

MarekZeman91 Points 21

Je sais que c'est un sujet un peu ancien, mais je pense que c'est une solution beaucoup plus simple.

 ViewPager viewPager = new ViewPager(this);
viewPager.setAdapter(yourPagerAdapter);

// somewhere where you setup your viewPager add this
viewPager.setOnTouchListener(
    new View.OnTouchListener() {
        private boolean moved;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                moved = false;
            }
            if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                moved = true;
            }
            if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                if (!moved) {
                    view.performClick();
                }
            }

            return false;
        }
    }
);

// then you can simply use the standard onClickListener ...
viewPager.setOnClickListener(
    new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Log.i(LOG, "Dayum!");
        }
    }
);
 

2voto

Tapirboy Points 1963

Alors que ce n'est pas une réponse directe à la façon de faire le onClick est déclenchée, elle pourrait très bien être une réponse utile pour le problème lié à la capture des événements de clic dans ViewPager.

Il suffit d'ajouter l'attribut onClick de la mise en page du fichier xml pour la pagination de l'élément et ajouter une méthode dans votre activité.

Exemple de code:

PagerAdapter:

class SamplePagerAdapter extends PagerAdapter {
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        // Inflate a new layout from our resources
        View view = getActivity().getLayoutInflater().inflate(R.layout.pager_item,
                container, false);
        // Add the newly created View to the ViewPager
        container.addView(view);
        // ... 

mise en page pager_item.xml

<?xml version="1.0" encoding="utf-8"?>

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    // usual attributes
  >

    <ImageButton 
      // usual attributes
      android:onClick="handleAction"
    />

 </LinearLayout>

MainActivity:

  public class MainActivity extends Activity {
  /* 
   ...
  */
    public void handleAction(View view) {
      // do your stuff
    }
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X