developer tip

ViewPager의 onClick이 트리거되지 않았습니다.

optionbox 2020. 12. 27. 10:38
반응형

ViewPager의 onClick이 트리거되지 않았습니다.


에 클릭 리스너를 설정 ViewPager했지만 onClick 이벤트가 호출되지 않습니다. 의 터치 이벤트 감지 ViewPager가 방해가되는 것 같지만 해결 방법을 알 수 없습니다.

아무도 도울 수 있습니까?

감사

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

실제로 뷰 페이저가 방해하고 있습니다. 그러나 뷰 페이저의 메서드를 재정 의하여 원하는 작업을 수행 할 수 있습니다. ViewGroup.onInterceptTouchEvent (MotionEvent ev) 메서드 를 재정의해야합니다 .

터치 이벤트가 통과하도록 항상 false를 반환 할 수 있습니다. 스 와이프가 계속 작동 할 수 있도록 super.onInterceptTouchEvent (ev)를 호출하는 것이 좋습니다.

MotionEvent를 전달 하므로 원하는 경우 클릭 수를 확인할 수 있습니다.

도움이되기를 바랍니다. 적어도 시작해야합니다. 질문이나 추가 문제가 있으면 다시 게시하십시오.

편집하다:

ViewPager는 클릭을 소비하지 않습니다. 따라서 클릭을 캡처하고 잠재적으로 많은 작업을 절약하려는 경우 뷰 페이지의 일부 또는 모든 하위에 onclicklistener를 쉽게 설정할 수 있습니다.


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

그렇게 했어요 ...

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에서 클릭 이벤트 캡처와 같은 관련 문제에 대한 유용한 대답 일 수 있습니다.

호출기 항목에 대한 레이아웃 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>

MainActivity :

  public class MainActivity extends Activity {
  /* 
   ...
  */
    public void handleAction(View view) {
      // do your stuff
    }
  }

ViewPager자녀가 터치 이벤트를 수신 할 수없고 대신 가져 가도록의 초점 기능을 설정할 수 있습니다 .


페이지 내의 의도하지 않은보기 중 하나가 클릭 이벤트를 사용하지 않는지 확인하십시오. 이미지보기에서 android : clickable이 true이고 부모로부터 클릭 이벤트를 가져올 수없는 문제가 발생했습니다. 이미지보기에서 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);               
            }
     });

}

}


이를 수행하는 적절한 방법은 Activity에서 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) {
    }

}

ReferenceURL : https://stackoverflow.com/questions/10243690/onclick-on-viewpager-not-triggered

반응형