Подтвердить что ты не робот

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

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

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

Спасибо

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

Ответ 1

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

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

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

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

EDIT:

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

Ответ 2

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

Ответ 3

Я так сделал...

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

Ответ 4

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

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!");
        }
    }
);

Ответ 5

Хотя это не прямой ответ на вопрос о том, как запустить onClick, это может быть полезным ответом на связанную проблему - захват событий clickPage в 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
    }
  }

Ответ 6

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

Ответ 7

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

}

}

Ответ 8

Правильный способ сделать это - реализовать 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) {
    }

}