onClick的ViewPager没有触发

我在ViewPager上设置了一个点击侦听ViewPager ,但是onClick事件从不被调用。 我猜测ViewPager的触摸事件检测是干扰的,但我看不出如何解决它…

任何人都可以帮忙?

谢谢

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

事实上,这个观点是干涉的。 但是你可以重写viewpager的方法来使它做你想做的事情。 您需要重写ViewGroup.onInterceptTouchEvent(MotionEvent ev)方法。

你总是可以返回false来允许触摸事件通过。 我也build议调用super.onInterceptTouchEvent(ev)允许滑动继续工作。

它通过一个MotionEvent ,所以你可以检查点击与如果你想要的。

希望有所帮助。 至less应该让你开始。 回复问题或进一步的问题。

编辑:

另请注意,ViewPager不会消耗点击量。 因此,如果您希望捕获点击并可能为您节省大量工作,您可以轻松地在viewpager的任何或所有子级上设置onclicklistener。

我通过使用GestureDetector解决了类似的问题

将MotionEvent发送到GestureDetector

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

它正在使用兼容性库,可以将第一行更改为:

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

你可以在GestureListener中处理你的事件:

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

我这样做…

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

我知道这是一个古老的话题,但我认为这是更容易的解决scheme。

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

虽然这不是直接回答如何触发onClick,但它可能是相关问题的有用答案 – 在ViewPager中捕获点击事件。

只需在布局xml文件中为分页器项目添加onClick属性,然后在您的活动中添加该方法即可。

示例代码:

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

布局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> 

主要活动

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

您可以设置ViewPager的可聚焦性,以便它的孩子不能接收触摸事件,而是取而代之。

确保页面内的一个非意图视图不消耗点击事件。 我有一个问题,在图像视图android:clickable是真实的,我不能从它的父母点击事件。 从图像视图中删除该android:可点击后,点击事件现在发送到其父(BannerView)。 请参阅示例代码

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

}

正确的方法是在Activity中实现ViewPager.OnPageChangeListener。 这里是一个例子:

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