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