onClick su ViewPager non triggersto

Ho impostato un listener di clic su un ViewPager , ma l'evento onClick non viene mai chiamato. Immagino che il rilevamento dell'evento touch del ViewPager interferisca, ma non riesco a vedere come risolverlo …

Qualcuno potrebbe aiutare?

  • Android Studio bloccato su "Gradle: risolvere le dependencies '_debugCompile'" o "disconnectConfiguration1"
  • Come impostare le immagini dymaniche in ViewFlipper in android?
  • Crea video dalle immagini
  • azione di trasmissione sul cambiamento di authorization in android M
  • Android: Finestra WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
  • In Android EditText, come forzare la scrittura maiuscola?
  • Grazie

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

  • Animazione personalizzata di FragmentTransaction di Android (nome animato sconosciuto: traduci)
  • Proguard con OrmLite su Android
  • MediaPlayer interrompe dopo circa 5 secondi
  • Quando utilizza il CoordinatorLayout, il mio ScrollView ha una dimensione errata
  • script di batch - se esistono ./sdcard/file.any usando adb
  • Convertire il valore di secondi in ore minuti secondi?
  • 8 Solutions collect form web for “onClick su ViewPager non triggersto”

    Infatti il ​​viewpager interferisce. Ma è ansible ignorare i methods del viewpager per farlo fare quello che vuoi. Dovresti ignorare il metodo ViewGroup.onInterceptTouchEvent (MotionEvent ev) .

    Potresti sempre tornare falso per permettere agli events di toccare di cadere. Raccommand anche di call super.onInterceptTouchEvent (ev) per consentire agli swipes di continuare a lavorare.

    Passa in un MotionEvent , in modo da poter controllare i clic con quello se volevi.

    Spero possa aiutare. Dovresti alless iniziare. Ritornare con domande o ulteriori problemi.

    EDIT:

    Notare anche che ViewPager non consuma clic. Pertanto è ansible impostare facilmente un onclicklistener su uno o tutti i figli del viewpager se si desidera catturare i clic e potenzialmente risparmiare un sacco di lavoro.

    Ho risolto un problema simile utilizzando un GestureDetector

    Invio di MotionEvent al GestureDetector

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

    Si sta utilizzando la libreria di compatibilità, è ansible modificare la prima row per:

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

    È ansible gestire il tuo evento nel GestureListener:

      class TapGestureListener extends GestureDetector.SimpleOnGestureListener{ @Override public boolean onSingleTapConfirmed(MotionEvent e) { // Your Code here } } 

    Ho fatto così …

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

    So che è un po 'vecchio argomento, ma penso che sia una soluzione molto più facile.

     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!"); } } ); 

    Sebbene questa non sia una risposta diretta a come avviare l'onClick, potrebbe benissimo essere una risposta utile al problema correlato: catturare gli events di click in ViewPager.

    Basta aggiungere l'attributo onClick nel file xml di layout per l'elemento pager e aggiungere il metodo nell'attività.

    Codice di esempio:

    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); // ... 

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

    È ansible impostare la focalizzazione del ViewPager modo che i bambini non riescano a ricevere events touch e li prende invece.

    Assicurarsi che una delle viste involontarie all'interno della pagina non consumi l'evento di clic. Ho avuto un problema in cui android: cliccabile era vero nella visualizzazione image e non ho potuto get evento clic dal suo genitore. Dopo aver rimosso tale android: cliccabile dalla vista image, gli events click vengono inviati al suo genitore (BannerView). Vedere il codice di esempio

     public ViewPagerAdapter extends PagerAdapter { ... public Object instantiateItem (ViewGroup container, int position) { MyItem item = this.myItems.get(position); BannerView bannerView = new BannerView(container.getContext()); ImageView imageView = (ImageView) bannerView.findViewById(R.id.header_image); this.setupClickListener(bannerView, position); container.addView(bannerView); return bannerView; } private void setupClickListener(final BannerView view, final int position) { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Page is clicked! MyItem item = ViewPagerAdapter.this.myItems.get(position); ViewPagerAdapter.this.showNextActivity(view.getContext(), item); } }); } 

    }

    Il modo giusto per farlo è quello di implementare ViewPager.OnPageChangeListener nella tua attività. Ecco un esempio:

     public class MyActivity implements ViewPager.OnPageChangeListener { private ViewPager mViewPager; private int mLastPagePosition = -1; @Override protected void onCreate(Bundle savedInstanceState) { ... mViewPager = (ViewPager) findViewById(R.id.viewpager); mViewPager.addOnPageChangeListener(this); ... } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (mLastPagePosition != position) { // the selected page is changed mLastPagePosition = position; } } @Override public void onPageSelected(int position) { if (mLastPagePosition != position) { // the selected page is changed mLastPagePosition = position; } } @Override public void onPageScrollStateChanged(int state) { } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.