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
'developer tip' 카테고리의 다른 글
Python 메모리 내 zip 라이브러리 (0) | 2020.12.27 |
---|---|
Python sqlite3에서 기존 db 파일을 메모리에로드하는 방법은 무엇입니까? (0) | 2020.12.27 |
기본값으로 오늘 부트 스트랩 datepicker (0) | 2020.12.27 |
Asp.net MVC 4에서 Simple Ajax Beginform을 사용하는 방법은 무엇입니까? (0) | 2020.12.27 |
config () 모듈에 종속성 삽입-AngularJS (0) | 2020.12.27 |