onClick на ViewPager не срабатывает

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

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

Спасибо

<code>mViewPager.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // never called
    }
}); 
</code>
 bhekman03 июл. 2012 г., 16:17
Актуальный просмотр списка не конфликтует с просмотрщиками. Настройка onClickListeners под ViewPager тоже должна работать нормально.
 jul20 апр. 2012 г., 12:18
@ Джерри: точно!
 Herry20 апр. 2012 г., 12:01
означает, что вы хотите знать, какой элемент кликает во ViewPager. Это означает, что позиция страницы является кликом, я прав?
 Herry20 апр. 2012 г., 11:47
то, что вы хотите сделать с помощью Click, может помочь найти другое решение.
 jul20 апр. 2012 г., 11:57
Я хочу что-то вроде ListView на onItemClickListener ()

Ответы на вопрос(8)

Решение Вопроса

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

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

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

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

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

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

 04 сент. 2013 г., 11:28
@CQM также вы можете реализовать его как ViewPager.setOnTouchListener ()
 28 янв. 2013 г., 02:54
это входит в мой подкласс PagerAdapter? Как / где будет записано это переопределение?
 23 окт. 2015 г., 23:50
Для меня в OnTouchListener ViewPager он не пересылает событие ACTION_DOWN, а просто начинается с ACTION_MOVE, за которым следует ACTION_UP при перетаскивании, и не отправляет ничего, когда вы просто щелкаете по нему, поэтому кажется, что переопределение onInterceptTouchEvent может переопределить быть единственным решением.

что это довольно старая тема, но я думаю, что это гораздо более простое решение.

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 (m,otionEvent.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!");
        }
    }
);
 18 июл. 2014 г., 21:13
Nexus 5 будет отправлять ACTION_MOVE при нажатии, если ваш палец чуть-чуть двигается.
 09 дек. 2015 г., 15:00
Не работает на моем Nexus 5 (Android 6.0), я просто получаю ACTION_DOWN и ACTION_UP.

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

}

}

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;
    }
});
 26 янв. 2016 г., 17:53
Я не вижу, как это "некрасиво". решение.

как вызвать 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 так что его дети не могут получать сенсорные события, и он принимает их вместо этого.

 08 июн. 2015 г., 13:03
Нет, не работает, если просмотр пейджера встроен в просмотр списка или прокрутки

r в вашу активность. Вот пример:

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

}

Отправка 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
         }
        }
 29 июн. 2013 г., 10:38
Спасибо, это сработало для меня, так как я не смог расширить ViewPager.
 16 апр. 2015 г., 17:04
Большое спасибо! Работает отлично!
 08 сент. 2013 г., 08:41
Спасибо, я использовал этот код следующим образом:pastebin.com/fSrP6Rfq
 11 апр. 2014 г., 16:59
Это то, что ищет +1 для этого
 19 июл. 2014 г., 17:07
РассматриватьonSingleTapUp вместоonSingleTapConfirmed если вы хотите, чтобы событие срабатывало при нажатии, напримерsetOnClickListener сделал бы. В противном случае событие будет инициировано через некоторое время, следя за тем, чтобы за ним не последовало второе нажатие.

Ваш ответ на вопрос