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