Вопрос по android, android-viewpager – onClick на ViewPager не срабатывает

56

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

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

Спасибо

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

Ваш Ответ

8   ответов
20

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

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

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

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

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

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

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

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;
    }
});
Я не вижу, как это "некрасиво". решение.
5

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

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!");
        }
    }
);
Nexus 5 будет отправлять ACTION_MOVE при нажатии, если ваш палец чуть-чуть двигается.
Не работает на моем Nexus 5 (Android 6.0), я просто получаю ACTION_DOWN и ACTION_UP.
2

как вызвать 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
    }
  }
0

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

Нет, не работает, если просмотр пейджера встроен в просмотр списка или прокрутки
0

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

}
0

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

}

}

103

Отправка 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
         }
        }
Спасибо, я использовал этот код следующим образом:pastebin.com/fSrP6Rfq
Большое спасибо! Работает отлично!
Спасибо, это сработало для меня, так как я не смог расширить ViewPager.
РассматриватьonSingleTapUp вместоonSingleTapConfirmed если вы хотите, чтобы событие срабатывало при нажатии, напримерsetOnClickListener сделал бы. В противном случае событие будет инициировано через некоторое время, следя за тем, чтобы за ним не последовало второе нажатие.
Это то, что ищет +1 для этого

Похожие вопросы