ViewPager里面的TextView拦截触摸事件

Posted

技术标签:

【中文标题】ViewPager里面的TextView拦截触摸事件【英文标题】:TextView inside ViewPager intercepts touch events 【发布时间】:2013-03-18 06:16:08 【问题描述】:

我有一个包含两个片段的ViewPager。在我可以触摸的任何片段中,滑动以切换到另一个fragment。其中一个片段包含一个列表。列表中的项目包含一个TextView 和一个ImageView。问题是,如果您从点击ImageView 开始拖动,就可以了。但如果它来自TextView,则ViewPager 永远不会知道拖动,因此“平滑切换”永远不会发生。

这有什么线索吗?

编辑

这张图是为了展示我的 GUI 是怎样的。如果拖动是从 TextViewE 开始的,它不会开始。

【问题讨论】:

你应该发布一些代码。覆盖ViewPagerTextView 没有什么特别之处。 @aneal 看看图片是否更好地解释了我的想法 这让我很烦恼,我也很高兴看到答案。 TextView 里面的 ListView 拦截触摸,ViewPager 变得几乎不能用了。 手工图片+1! 【参考方案1】:

这件事也困扰着我,但我已经找到了答案。

基本上,情况是:如果视图可以水平滚动,它会拦截水平运动事件,ViewPager不能再处理它了。

由于 API 级别 14 TextViews 具有 android:scrollHorizo​​ntally 属性(和 setHorizo​​ntallyScrolling(boolean) 方法),如果设置为 true,导致 TextView 拦截水平滚动运动事件。

您可以在 XML 中或直接在代码中将其设置为 false,但 注意android:singleLine 属性强制 android:scrollHorizo​​ntally 设置为 true非常棘手的一点!但幸运的是,您通常可以安全地将单行属性替换为 android:maxLines="1" 和必要的 ellipsize 值。

祝你好运!

【讨论】:

发现了同样的问题,发现去掉singleLine语句就解决了。刚刚发现原因:D。谢谢! 如果我想为文本视图设置选框,我需要将 singleLine 设置为 true。有什么办法可以避免它并启用选取框吗? 哇,过去 1.5 天我一直在试图确定为什么我的 ViewPager 偶尔没有滚动,即使我可以看到它的触摸事件触发。这个答案救了我。原来我有一个带有singleLine=true 的TextView,这将停止ViewPager 滚动。由于 TextView 本身是一个非常大的视图,因此用户在该视图上尝试拖动的机会非常高 - 因此没有滚动。删除singleLine 是最终解决方案。再次感谢! android:maxLines="1" 为我工作,因为我需要设置椭圆大小。感谢您的回答。 这让我获得了大部分解决方案,但我发现除了 android:scrollHorizo​​ntally 之外,我还需要将我的文本视图设置为宽度的“match_parent”而不是“wrap_content”。 【参考方案2】:

您可以覆盖 TextView 的 onTouchEvent():

@Override
public boolean onTouchEvent(MotionEvent event) 
    if (event.getAction() == MotionEvent.ACTION_MOVE) 
        return false;
    

    return super.onTouchEvent(event);

【讨论】:

以上是关于ViewPager里面的TextView拦截触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

三层ViewPager嵌套 的事件处理

如何阻止 ExpandableListView 窃取子触摸事件?

android安卓的ViewPager实现活动页面切换

Android 嵌套触摸处理

在 viewpager 中检测触摸/点击事件

当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?