59

にクリック リスナーを設定しましたViewPagerが、onClick イベントが呼び出されません。のタッチイベント検出ViewPagerが干渉していると思いますが、解決方法がわかりません...

誰でも助けることができますか?

ありがとう

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

8 に答える 8

106

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
         }
        }
于 2012-07-26T09:51:15.840 に答える
23

私はそのようにしました...

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;
    }
});
于 2012-11-07T06:37:25.390 に答える
21

実際、viewpager が干渉しています。ただし、viewpager のメソッドをオーバーライドして、必要な動作をさせることができます。ViewGroup.onInterceptTouchEvent(MotionEvent ev)メソッドをオーバーライドする必要があります。

タッチ イベントが失敗するのを許可するために、常に false を返すことができます。スワイプが機能し続けるように、super.onInterceptTouchEvent(ev) を呼び出すこともお勧めします。

MotionEventを渡すので、必要に応じてそれでクリックをチェックできます。

それが役立つことを願っています。少なくとも開始する必要があります。質問やその他の問題を投稿してください。

編集:

ViewPager はクリックを消費しないことにも注意してください。したがって、クリックをキャプチャして多くの作業を節約したい場合は、viewpager の一部またはすべての子に onclicklistener を簡単に設定できます。

于 2012-07-03T01:52:48.227 に答える
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!");
        }
    }
);
于 2014-07-08T06:51:10.867 に答える
3

これは onClick をトリガーする方法に対する直接的な答えではありませんが、関連する問題 (ViewPager でクリック イベントをキャプチャする) に対する有用な答えになる可能性があります。

ページャー アイテムのレイアウト xml ファイルに onClick 属性を追加し、アクティビティにメソッドを追加するだけです。

サンプルコード:

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>

メインアクティビティ:

  public class MainActivity extends Activity {
  /* 
   ...
  */
    public void handleAction(View view) {
      // do your stuff
    }
  }
于 2014-10-20T09:54:58.637 に答える
0

のフォーカス可能性を設定して、ViewPager子がタッチイベントを受信できず、代わりにそれらを取得するようにすることができます。

于 2012-04-20T09:46:09.400 に答える