ViewPager中的TextView拦截了触摸事件

15

我有一个包含两个片段的ViewPager。在任何一个片段中,我可以触摸一个地方,并滑动以切换到另一个fragment。其中一个片段包含一个列表,列表中的项包含一个TextView和一个ImageView。问题是,如果你从点击ImageView开始拖动,那么就没问题。但是如果从TextView开始拖动,拖动对于ViewPager来说是未知的,结果“平滑切换”就不会发生。

对此有什么线索吗?

编辑

这张图片展示了我的GUI是如何的。如果从TextViewE开始拖动,则无法开始。 enter image description here


1
你应该发布一些代码。在覆盖ViewPagerTextView中并没有什么特殊的东西。 - adneal
1
@aneal 看看这张图片是否更好地解释了我的想法。 - tactoth
这个问题困扰了我很久,我也很想知道答案。ListView中的TextView会拦截触摸事件,ViewPager几乎无法使用。 - pechenie
1
+1 for手工图片! - avalancha
2个回答

40

这个问题也困扰着我,但我已经找到了答案。

基本上情况是这样的:如果视图可以水平滚动,它会拦截水平滑动事件,而ViewPager就无法处理了。

自从API Level 14之后,TextViews具有android:scrollHorizontally属性(和setHorizontallyScrolling(boolean)方法),如果设置为true,则会导致TextView拦截水平滑动事件。

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

祝你好运!


1
发现了相同的问题,并发现删除singleLine语句解决了。刚刚找到原因:D。谢谢! - Carlos Sobrinho
如果我想将跑马灯设置到文本视图中,我需要将 singleLine 设置为 true。有没有办法避免这样做并同时启用跑马灯呢? - berserk
哇,我已经花了最近1.5天的时间来确定为什么我的ViewPager偶尔不会滚动,即使我可以看到它的触摸事件正在触发。这个答案救了我。结果我有一个TextView是singleLine=true,这将停止ViewPager滚动。由于TextView本身是一个相当大的视图,用户在那个视图上拖动的机会相当高 - 因此没有滚动。删除singleLine是最终解决方案。再次感谢! - Cody Caughlan
1
android:maxLines="1" 对我很有用,因为我需要设置省略号。谢谢回答。 - Bharat Dodeja
这让我解决问题的大部分难题,但我发现除了使用android:scrollHorizontally之外,对于我来说,我还需要将文本视图的宽度设置为"match_parent"而不是"wrap_content"。 - AdamWardVGP
很棒的答案,singleLine已经被弃用了,请记得使用maxLines="1",谢谢! - jmsalcido

0
你可以重写 TextView 的 onTouchEvent() 方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        return false;
    }

    return super.onTouchEvent(event);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接