OnClick on ViewPager not starting

I installed a click listener on the ViewPager , but the onClick event is never raised. I assume that detecting the event of the ViewPager touch interferes, but I don’t see how to solve it ...

Can anybody help?

thank

 mViewPager.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // never called } }); 
+51
android android-viewpager
Apr 20 2018-12-12T00:
source share
8 answers

Indeed, the viewer is in the way. But you can override viewpager methods to make it do what you want. You need to override the ViewGroup.onInterceptTouchEvent (MotionEvent ev) method.

You can always return false so that touch events can fail. I would also recommend calling super.onInterceptTouchEvent (ev) to let swipes continue to work.

It takes place in MotionEvent , so you can check for clicks if you want.

Hope this helps. At least you should start. Send an answer with questions or further problems.

EDIT:

Please note that ViewPager does not use clicks. Therefore, you can easily install the onclicklistener for any or all of the children of the viewpager if you want to capture clicks and potentially save a lot of work.

+19
Jul 03 2018-12-12T00:
source share
β€” -

I solved a similar problem using GestureDetector

Submitting a MotionEvent to the GestureDetector

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

This is you using the compatibility library, you can change the first line to:

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

You can handle your event in the GestureListener:

  class TapGestureListener extends GestureDetector.SimpleOnGestureListener{ @Override public boolean onSingleTapConfirmed(MotionEvent e) { // Your Code here } } 
+101
Jul 26 2018-12-12T00:
source share

I did so ...

 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; } }); 
+18
Nov 07
source share

I know this topic, but I think it is a lot easier.

 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!"); } } ); 
+4
Jul 08 '14 at 6:51
source share

Although this is not a direct answer to the question of how to launch onClick, it may be a useful answer to a related problem - capturing clickPage events in ViewPager.

Just add the onClick attribute to your XML layout file for the pager element and add the method to your activity.

Code example:

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 } } 
+2
Oct 20 '14 at 9:54 on
source share

You can set the focus of the ViewPager so that children cannot receive touch events, and instead they take them.

0
Apr 20 2018-12-12T00:
source share

Make sure one of the unexpected views within the page is not using the click event. I had a problem when android: clickable was right in the image view and I could not get the click event from my parent. After deleting this android: clicking on the image, click events are now sent to the parent (BannerView). See Code Example

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

}

0
Dec 05 '13 at
source share

The right way to do this is to implement ViewPager.OnPageChangeListener in your activity. Here is an example:

 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) { } } 
0
Mar 07 '17 at 19:05
source share



All Articles