天天看點

android pageradapter點選事件,android-ViewPager上的onClick未觸發

android-ViewPager上的onClick未觸發

我在ViewPager上設定了一個單擊偵聽器,但從未調用過onClick事件。 我猜想ViewPager的觸摸事件檢測會幹擾您,但我看不到如何解決...

有人可以幫忙嗎?

謝謝

mViewPager.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// never called

}

});

8個解決方案

104 votes

我通過使用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

}

}

Martin Christmann answered 2019-11-12T14:45:33Z

21 votes

我那樣做...

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;

}

});

Kalpesh answered 2019-11-12T14:46:00Z

20 votes

确實,viewpager會幹擾。 但是,您可以覆寫viewpager的方法以使其執行所需的操作。 您需要重寫ViewGroup.onInterceptTouchEvent(MotionEvent ev)方法。

您可以始終傳回false以允許觸摸事件通過。 我還建議您調用super.onInterceptTouchEvent(ev)以允許滑動保持工作。

它傳遞了一個MotionEvent,是以您可以根據需要檢查是否有點選。

希望能有所幫助。 它至少應該讓您入門。 如有問題或其他問題,請發回。

編輯:

還要注意,ViewPager不會消耗點選。 是以,如果您想捕獲點選并有可能節省大量工作,則可以輕松地在viewpager的任何或所有子級上設定onclicklistener。

bhekman answered 2019-11-12T14:44:39Z

5 votes

我知道這是一個老話題,但是我認為這是更容易的解決方案。

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!");

}

}

);

MarekZeman91 answered 2019-11-12T14:46:35Z

2 votes

盡管這不是直接觸發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

// usual attributes

>

// usual attributes

android:onClick="handleAction"

/>

主要活動:

public class MainActivity extends Activity {

public void handleAction(View view) {

// do your stuff

}

}

Tapirboy answered 2019-11-12T14:47:31Z

0 votes

您可以設定ViewPager的可聚焦性,以使孩子無法接收觸摸事件,而是接管它們。

ScouseChris answered 2019-11-12T14:48:01Z

0 votes

確定頁面内的意外視圖之一沒有消耗點選事件。 我有一個問題,其中android:clickable在圖檔視圖上為true,而我無法從其父級獲得click事件。 從圖像視圖中删除該android: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);

}

});

}

}

tmin answered 2019-11-12T14:48:36Z

-1 votes

正确的方法是在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) {

}

}

Lee Hounshell answered 2019-11-12T14:49:03Z