Intereting Posts
Каково точное значение «кухонной мойки» в программировании? FindFragmentById всегда возвращает null AsyncTask Android – шаблон дизайна и возвращаемые значения Разработка IOS Xamarin Visual Studio без Mac? RelativeLayout выровнять родительский * боковой * + margin * side * Имена пакетов для доменов, которые заканчиваются на .do Как неявные объединенные столбцы работают с данными контактов Android? Возможно ли создать эскиз видеоролика в андроиде Глобальный загрузчик (LoaderManager) для повторного использования в нескольких действиях / фрагментах Устанавливать и запускать приложение на нескольких устройствах одним щелчком мыши по eclipse Каков синтаксис для написания комментариев в файле build.gradle? Android Deep linking: используйте ту же ссылку для приложения и магазина воспроизведения Статическая переменная null при возврате в приложение Что делает определенные классы андроидов «must -keep»? Как добавить кнопку динамически в Android?

OnClick on ViewPager не запускается

Я установил прослушиватель кликов на ViewPager , но событие ViewPager никогда не вызывается. Я думаю, что обнаружение сенсорного события в ViewPager мешает, но я не вижу, как его решить …

Кто-нибудь может помочь?

благодаря

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

Solutions Collecting From Web of "OnClick on ViewPager не запускается"

Действительно, просмотрщик вмешивается. Но вы можете переопределить методы viewpager, чтобы заставить его делать то, что вы хотите. Вам необходимо переопределить метод ViewGroup.onInterceptTouchEvent (MotionEvent ev) .

Вы всегда можете вернуть false, чтобы события касания могли провалиться. Я также рекомендовал бы вызвать super.onInterceptTouchEvent (ev), чтобы позволить swipes продолжать работать.

Он проходит в MotionEvent , поэтому вы можете проверить наличие кликов, если хотите.

Надеюсь, это поможет. По крайней мере, вы должны начать. Отправьте ответ с вопросами или дальнейшими проблемами.

РЕДАКТИРОВАТЬ:

Также обратите внимание, что ViewPager не использует клики. Поэтому вы можете легко установить onclicklistener для любого или всех дочерних элементов viewpager, если вы хотите захватить клики и потенциально сэкономить много работы.

Я решил аналогичную проблему, используя 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; } }); 

Я знаю, что это старая тема, но я думаю, что это намного проще.

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

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

Вы можете настроить фокусность ViewPager чтобы дети не могли получать события касания, и вместо этого они берут их.

Убедитесь, что один из непредвиденных просмотров внутри страницы не использует событие click. У меня была проблема, когда android: clickable был прав в представлении изображения, и я не мог получить событие click от своего родителя. После удаления этого андроида: щелкнув по изображению, события кликов теперь отправляются родительскому (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) { } }