onClick на ViewPager не срабатывает
Я установил кнопку слушателя на ViewPager, но событие onClick никогда не вызывается. Я думаю, обнаружение сенсорного события ViewPager вмешивается, но я не вижу, как это решить...
кто-нибудь может помочь?
спасибо
mViewPager.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// never called
}
});
8 ответов:
действительно viewpager вмешивается. Но вы можете переопределить методы viewpager, чтобы заставить ее делать то, что вы хотите. Вам нужно будет переопределить ViewGroup.onInterceptTouchEvent (MotionEvent ev) метод.
вы можете просто всегда возвращать false, чтобы позволить событиям касания провалиться. Я бы также рекомендовал позвонить супер.onInterceptTouchEvent (ev), чтобы позволить пойло продолжать работать.
Он проходит в MotionEvent, Так что вы можете проверить для кликов с этим, если вы хотите.
надеюсь, что это поможет. Она должна по крайней мере начать. Ответ с вопросов или проблем.
EDIT:
обратите внимание также, что ViewPager не потребляет кликов. Поэтому вы можете легко установить onclicklistener на любом или всех дочерних элементах viewpager, если хотите захватить клики и потенциально сэкономить много работы.
я решил аналогичную проблему с помощью GestureDetector
отправка события движения в 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; } });
Я знаю, что это своего рода старая тема, но я думаю, что это гораздо более простое решение.
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.
просто добавьте атрибут onClick в xml-файл макета для элемента пейджера и добавьте метод в свою деятельность.
пример кода:
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>MainActivity:
public class MainActivity extends Activity { /* ... */ public void handleAction(View view) { // do your stuff } }
вы можете установить фокусируемость
ViewPagerТак что это дети не могут получать сенсорные события, и он принимает их вместо этого.
убедитесь, что одно из непреднамеренных представлений внутри страницы не потребляет событие щелчка. У меня была проблема, когда android:clickable был истинным в представлении изображения, и я не мог получить событие щелчка от его родителя. После удаления этого android: clickable из представления изображения, события щелчка теперь отправляются его родителю (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); } }); }}
правильный способ сделать это-реализовать 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) { } }
Comments