我有一个带有ViewPager的Activity,其中包含3个动态创建的片段。每个页面都有许多按钮和ImageButton,它们可以自己激活onTouch..MotionEvent.ACTION_DOWN。
我遇到的问题是,当我尝试滑动ViewPager时,这些按钮会意外激活。
有人可以推荐一种防止这种情况发生的方法吗?
由于 约什
答案 0 :(得分:2)
而不是使用onTouch..MotionEvent.ACTION_DOWN。
在ImageButton上的我将使它们实现;
.OnItemClickListener() /This ensures that only when clicked they will call the desired functionality, I suggest you to check it out this way and let me know.
希望它有所帮助,更多信息; The Documentation for OnItemClickListener
答案 1 :(得分:0)
我认为您关注的流程并不是很好,按钮还具有处理ACTION_DOWN触摸事件的业务代码,而父(ViewPager)总是需要处理触摸事件来检测滚动事件,因此按钮将处理首先触摸ACTION_DOWN触摸事件,然后将触摸传递给ViewPager。
您可以将业务代码移动到Button的OnClickListener或其他方式,您应该让按钮拦截触摸事件并且不将其传递给ViewPager(父视图)。
这可以通过自定义Viewpager类并在自定义ViewPager中添加变量来轻松处理,如下所示:
private boolean mTouchEnable = true;
@Override
public boolean onTouchEvent(MotionEvent arg0) {
if (!mTouchEnable) {
return false;
}
return super.onTouchEvent(arg0);
}
该按钮需要对viewPager的引用,并在ACTION_DOWN中设置mTouchEnable = false,在ACTION_UP中设置为true
答案 2 :(得分:0)
我做了viewpager
个按钮,我能够复制这个问题。
我解决了这个问题:
我的按钮有一个监听器OnClickListener
optionButton.setOnClickListener(this);
public void onClick(View v) {
// your code here
}
然后我将此按钮添加到我的customPagerAdapter
在customViewPager
中,您必须覆盖onInterceptTouchEvent
方法,如下所示:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
super.onInterceptTouchEvent(ev);
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
return true;
}
else{
return false;
}
}
此代码将拦截子视图中的MotionEvent.ACTION_MOVE
(返回true),并且不会在子视图中拦截MotionEvent.ACTION_DOWN
onClick
事件。