【问题标题】:ViewPager intercepts all x-axis onTouch events. How to disable?ViewPager 拦截所有 x 轴 onTouch 事件。如何禁用?
【发布时间】:2011-12-28 16:15:54
【问题描述】:

范围

有两个片段的viewpager。其中一个片段有一个布局,女巫监听 X 轴上的 onTouch 变化。

问题

当沿 X 轴触摸和滑动时,布局不会获得几乎所有的 Action.Move 事件。 似乎 viewpager 有一个 onInterceptTouchEvent 返回 true。

问题

是否真的要覆盖 viewpager 的行为以使其与我的布局一起工作?所以完美的情况是 layout 拦截了它上面的所有 onTouch 事件,而 viewpager 管理其余的 onTouch 事件。谢谢!

【问题讨论】:

  • 我在 ViewPager 处理的 Fragment 视图之一中使用了列表......我也面临同样的问题......如果开始滑动......它开始在 x 方向上稍微移动...... ..我也试过@neutrino ......但问题仍然存在......有什么建议/想法吗?
  • 另外我在 Fragment 中使用 Listview...所以我还必须为列表视图询问 requestDisallowInterceptTouchEvent true...但现在很忙...因为它拦截了列表事件的单击事件...有什么建议/更新吗?
  • 这里也有一些有趣的东西stackoverflow.com/a/7814054/2624806

标签: android ontouchlistener android-viewpager


【解决方案1】:

类似的情况(但不使用 ViewPager),将它放在需要触摸事件的视图中对我有用。如果适用于您的用例,请添加对 ACTION_MOVE 以外的 MotionEvents 的检查。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        this.getParent().requestDisallowInterceptTouchEvent(true);
        return true;
    } else {
        return super.onTouchEvent(event);
    }
}

【讨论】:

  • 这是正确的解决方案,但是我想指出,如果您不返回 true,该事件仍将由 ViewPager(或任何中间 ViewGroups)处理。如果返回 false,则事件未处理,并将传播回 ViewPager。
【解决方案2】:

你是对的,我相信每个滚动容器都会拦截触摸事件,但你可以阻止它。您可以在布局上放置一个触摸监听器:

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_MOVE: 
        pager.requestDisallowInterceptTouchEvent(true);
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        pager.requestDisallowInterceptTouchEvent(false);
        break;
    }
}

【讨论】:

  • 谢谢!我应该对 android 文档更加耐心和谨慎。
  • 这只适用于 onTouch 吗?我在 onScale 中试过了,但它仍然在拦截我的触摸。
  • 两个注意事项: 1. 您不必保留对寻呼机的引用 - 调用 getParent().request... 就足够了,父级将传播请求。它使在自定义视图中使用更加灵活。 2. 起初我认为在启动时调用request... 一次视图就足够了。似乎必须为每个触摸事件调用它。这就是为什么你必须这样做onTouch()@dev_android
  • 当用户在我的图像上水平滑动时,这会阻止选项卡切换。太棒了!
  • 如果您通过在寻呼机适配器上调用 notifyDataSetChanged 来更新 ViewPager 的内容,同时在监听 onTouch 事件的布局上滑动,它就不再起作用了!然后 ViewPager 翻转。有谁知道解决办法吗?
【解决方案3】:

我也遇到过类似的问题。

在我的例子中,我在ViewPager 上设置了一个OnTouchListener,但是当接收到触摸的孩子设置了onClick 时,它没有接收到触摸事件。

我所做的是扩展 ViewPager 类并在方法 onInterceptTouchEvent(boolean) 中调用我的点击侦听器,它工作正常。请注意不要拦截错误的事件。

【讨论】:

    【解决方案4】:

    中微子是对的!

    getParent().requestDisallowInterceptTouchEvent(true);
    

    一旦viewpager访问了touchEvent Intercept,它里面的子view就可以得到这个事件。 enter image description here


    我在 viewpager 中使用 FrameLayout 来获得 DrawerLayout 效果(我需要它与屏幕的高度不匹配,所以我不能使用抽屉布局或导航抽屉)。
    真的很有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多