onClick没有触发ViewPager

jul*_*jul 56 android android-viewpager

我在a上设置了一个单击侦听器ViewPager,但是从不调用onClick事件.我猜触摸事件检测ViewPager是干扰,但我看不出如何解决它...

有人可以帮忙吗?

谢谢

mViewPager.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // never called
    }
}); 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 105

我通过使用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;
        }
});
Run Code Online (Sandbox Code Playgroud)

您正在使用兼容性库,您可以将第一行更改为:

tapGestureDetector = new GestureDetectorCompat(this, new TapGestureListener());
Run Code Online (Sandbox Code Playgroud)

您可以在GestureListener中处理您的事件:

        class TapGestureListener extends GestureDetector.SimpleOnGestureListener{

         @Override
         public boolean onSingleTapConfirmed(MotionEvent e) {
           // Your Code here
         }
        }
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要事件,请考虑[`onSingleTapUp`](https://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html#onSingleTapUp%28android.view.MotionEvent%29)而不是`onSingleTapConfirmed`点击时触发,就像`setOnClickListener`那样.否则,事件将在一段时间后触发,确保没有第二次点击. (5认同)
  • 非常感谢!工作完美! (2认同)

Kal*_*esh 21

我这样做了......

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;
    }
});
Run Code Online (Sandbox Code Playgroud)


bhe*_*man 20

事实上,观察者正在干涉.但是你可以覆盖viewpager的方法,使它做你想做的.您需要覆盖ViewGroup.onInterceptTouchEvent(MotionEvent ev)方法.

您可以随时返回false以允许触摸事件通过.我还建议调用super.onInterceptTouchEvent(ev)以允许滑动继续工作.

它传入MotionEvent,因此您可以根据需要检查点击次数.

希望有所帮助.它应该至少让你开始.回复问题或进一步的问题.

编辑:

另请注意,ViewPager不会消耗点击次数.因此,如果您想捕获点击次数并可能为自己节省大量工作,您可以轻松地在viewpager的任何或所有子项上设置onclicklistener.

  • @CQM你也可以把它实现为ViewPager.setOnTouchListener() (3认同)

小智 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 (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!");
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

  • 如果您的手指移动一点点,Nexus 5将在点击时发送ACTION_MOVE. (3认同)