【问题标题】:Temporary bypassing ListView scrolling临时绕过 ListView 滚动
【发布时间】:2011-01-08 08:41:47
【问题描述】:

我有一个显示WebViews 的ListActivity
有一个菜单选项可以复制将在可见 WebView 上调用 this 的文本。
一切正常,除了一件事。我无法在垂直方向执行文本选择,因为 ListView 会消耗相应的 MotionEvents 来进行自己的滚动。
我试过这个:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (webViewsInTextSelectionMode) {
        bypassEventToWebViews(ev);
        return true;
    } else {
        return super.dispatchTouchEvent(ev);
    }
}

这将阻止滚动,但也会将未调整的MotionEvent 坐标传递给WebView
在这种情况下,有没有办法正确防止 ListView 滚动?

【问题讨论】:

    标签: android


    【解决方案1】:

    我有一个显示 WebViews 的 ListActivity。

    这不是一个好主意。 WebViewListView 将参加运动赛事。在 Android 中很少建议将滚动内容放在滚动内容中,尤其是当它们可以沿同一方向滚动时(在本例中为向上和向下)。

    有一个菜单选项可以复制将在可见 WebViews 上调用它的文本。

    如果您指的是该问题的公认答案,那也不是一个好主意。我对另一个答案持怀疑态度,但至少这不是一个坏主意prima facia

    除了一件事,一切都有效。我无法在垂直方向执行文本选择,因为 ListView 会为自己的滚动消耗相应的 MotionEvents。

    正是我的观点。

    在这种情况下,有没有办法正确防止 ListView 滚动?

    我会专注于摆脱WebViews,用TextViewHtml.fromHtml() 代替它们。或者,去掉 ListView,使用单个 WebView 来呈现您的合并内容。

    【讨论】:

    • 同意,如果我必须从头开始,我会选择一个 WebView。仍然使用自 API 8 以来公开的 emulateShiftHeld()
    【解决方案2】:

    这是在黑暗中拍摄的完整照片,很可能不会奏效,但值得一试。您可以尝试在包含您的WebViewViewGroup 内部的父ListView 上调用ViewParent#requestDisallowInterceptTouchEvent。每次在文本选择期间发生向下运动事件时,您都必须调用它。这是因为标志在向上/取消运动事件时重置。

    如果这不起作用,您可能必须创建自己的 ListView 副本并适当地修改它。这并不太令人生畏,您必须将类层次结构中的所有类复制回AdapterView 并修复复制的 AdapterView 类(主要使用具有受保护/公共访问器功能的私有/包级成员变量)。

    【讨论】:

    • requestDisallowInterceptTouchEvent() 就是答案。谢谢!
    • 也为我工作 - 只是让谷歌知道 - 我试图在连续向右(或向左)滑动时禁用 ListView 滚动。滚动干扰了滑动并取消了它 - 因此在滑动时禁止拦截触摸事件(向下/移动事件)起到了作用 - 它现在完美无缺!谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多