使用 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 其中 viewViewPager

现在您可以检查 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失效问题

如何在 Android 中使用 TabLayout 和 ViewPager2