OnClick on ViewPager не запускается
Я установил прослушиватель кликов на ViewPager
, но событие onClick никогда не вызывается. Я предполагаю, что обнаружение события касания ViewPager
мешает, но я не вижу, как его решить...
Кто-нибудь может помочь?
Спасибо
mViewPager.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// never called
}
});
Ответы
Ответ 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) {
}
}