使用 ViewPager 和 PassByValue 滑动页面时将执行 onTouchEvent
Posted
技术标签:
【中文标题】使用 ViewPager 和 PassByValue 滑动页面时将执行 onTouchEvent【英文标题】:onTouchEvent is getting executed when page is swiped using ViewPager and PassByValue 【发布时间】:2012-06-05 09:43:51 【问题描述】:在我的项目中使用 onTouchEvent 来检测屏幕上的触摸并进行相应的操作,并使用 viewPager 进行滑动操作。问题在于滑动触摸动作正在执行。所以从here 找到解决方案解决了它。但是我的新问题是一旦 TouchEvent.Action_up 被执行,触摸就会被禁用。代码如下:
parent.setOnTouchListener(new OnTouchListener()
public boolean onTouch(View v, MotionEvent event)
switch(event.getAction())
case MotionEvent.ACTION_MOVE:
awesomePager.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
awesomePager.requestDisallowInterceptTouchEvent(true);
if(flag)
upperdock.setClickable(false);
upperdock.bringToFront();
tocparent.bringToFront();
tocbottom.bringToFront();
upperdock.setVisibility(RelativeLayout.VISIBLE);
tocparent.setVisibility(LinearLayout.VISIBLE);
tocbottom.setVisibility(LinearLayout.VISIBLE);
flag=false;
else
parent.bringToFront();
upperdock.setVisibility(RelativeLayout.INVISIBLE);
tocparent.setVisibility(LinearLayout.INVISIBLE);
tocbottom.setVisibility(LinearLayout.INVISIBLE);
flag=true;
break;
case MotionEvent.ACTION_CANCEL:
awesomePager.requestDisallowInterceptTouchEvent(false);
break;
default:
break;
return false;
);
在上面的代码中,如果我返回 false,Action_up 没有被执行..如果我返回 true,Action_cancel 没有被执行..这是按值传递的问题。
【问题讨论】:
【参考方案1】:我为此改变了一些东西。
不使用
awesomePager.requestDisallowInterceptTouchEvent(false)
,
只需使用return true
。
在activity中定义一个boolean sroll;
在 ViewPager.onPageScrolled 中设置 sroll = positionOffset != 0.0 我覆盖 onTouchEvent 其中 view 在 ViewPager。
现在您可以检查 if (event.getAction()==MotionEvent.ACTION_UP && !sroll) 来决定是否触发事件
【讨论】:
【参考方案2】:我遇到了同样的问题!对我来说,这非常有效....
case MotionEvent.ACTION_MOVE:
getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_CANCEL:
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
//delete awesomePager.requestDisallowInterceptTouchEvent(true);
//you don't need it here!
.
.
do your stuff....
.
将您的整个 onTouch 方法返回为真而不是假...
return true;
【讨论】:
以上是关于使用 ViewPager 和 PassByValue 滑动页面时将执行 onTouchEvent的主要内容,如果未能解决你的问题,请参考以下文章
Android ------ ViewPager1和ViewPager2的使用
Android ------ ViewPager1和ViewPager2的使用
如何使用导航抽屉和viewpager/viewpager2在java中制作android应用程序
使用 recyclerview 和 Asynctask 设置 Viewpager
有关ViewPager使用及解决ViewPager和PagerAdapter中调用notifyDataSetChanged失效问题