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



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



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



спасибо



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

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

    Ничего не найдено.