【问题标题】:Android TextView Linkify intercepts with parent View gesturesAndroid TextView Linkify 拦截父视图手势
【发布时间】:2011-11-06 09:38:12
【问题描述】:

问题是,如果我链接 textView 下的 ScrollView 不听我设置的扫描手势。有没有办法让 Linkify 不弄乱下视图的手势? 我试图覆盖 ontouchEvent 并将 false 返回给 ACTION_MOVE 但滚动视图的手势需要 ACTION_DOWN 和 ACTION_UP 事件才能起作用。有没有办法做到这一点?

【问题讨论】:

    标签: android gesture linkify


    【解决方案1】:

    Linkify 应用于 textView LinkMovementMethod 的移动方法。该移动方法认为它实现了垂直滚动方法,它覆盖了父级拥有的任何其他滚动方法。虽然touchEvent 可以发送给父级,但特定的父级ScrollView 需要整个序列ACTION_DOWN、ACTION_MOVE、ACTION_UP 来执行(扫描检测)。

    所以我的问题的解决方法是在Linkify之后去掉textView的滚动方法,处理textView的onTouchEvent中的LinkMovementMethod链接检测动作。

    @override
    public boolean onTouchEvent(MotionEvent event) {
            TextView widget = (TextView) this;
            Object text = widget.getText();
            if (text instanceof Spanned) {
                Spannable buffer = (Spannable) text;
    
                int action = event.getAction();
    
                if (action == MotionEvent.ACTION_UP
                        || action == MotionEvent.ACTION_DOWN) {
                    int x = (int) event.getX();
                    int y = (int) event.getY();
    
                    x -= widget.getTotalPaddingLeft();
                    y -= widget.getTotalPaddingTop();
    
                    x += widget.getScrollX();
                    y += widget.getScrollY();
    
                    Layout layout = widget.getLayout();
                    int line = layout.getLineForVertical(y);
                    int off = layout.getOffsetForHorizontal(line, x);
    
                    ClickableSpan[] link = buffer.getSpans(off, off,
                            ClickableSpan.class);
    
                    if (link.length != 0) {
                        if (action == MotionEvent.ACTION_UP) {
                            link[0].onClick(widget);
                        } else if (action == MotionEvent.ACTION_DOWN) {
                             Selection.setSelection(buffer,
                                     buffer.getSpanStart(link[0]),
                                     buffer.getSpanEnd(link[0]));
                        }
                        return true;
                    }
                }
    
            }
    
            return false;
        }
    

    这样我就有了 Link_Click 检测(仅在用户触摸链接而不是整个 textview 时执行)并且我没有整个 LinkMovementMethod。

    【讨论】:

    • 我很高兴它终于帮助了某人:D
    • 不错的解决方案,清晰且不老套。我不得不将 return true; 移动到 internal 的正分支,如果让跨度在稳定触摸时突出显示。
    • 上面提到的“删除 textView 的滚动方法”是通过 textView.setMovementMethod(null); 完成的,并且必须在您设置 textView 的文本之后调用 。
    • 谢谢,这为我节省了很多时间!
    【解决方案2】:

    @weakwire 和 @Ridicully 的答案是正确的。我刚刚创建了一个可以在项目中重复使用的小要点。

    这是链接:https://gist.github.com/amilcar-andrade/e4b76840da1dc92febfc

    【讨论】:

    【解决方案3】:

    有个小坏事 TextView::setText(...) 方法利用 autoLink 标志,

    if (mAutoLinkMask != 0) {
            Spannable s2;
    
            if (type == BufferType.EDITABLE || text instanceof Spannable) {
                s2 = (Spannable) text;
            } else {
                s2 = mSpannableFactory.newSpannable(text);
            }
    
            if (Linkify.addLinks(s2, mAutoLinkMask)) {
                text = s2;
                type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE;
    
                /*
                 * We must go ahead and set the text before changing the
                 * movement method, because setMovementMethod() may call
                 * setText() again to try to upgrade the buffer type.
                 */
                mText = text;
    
                // Do not change the movement method for text that support text selection as it
                // would prevent an arbitrary cursor displacement.
                if (mLinksClickable && !textCanBeSelected()) {
                    setMovementMethod(LinkMovementMethod.getInstance());
                }
            }
        }
    

    所以我花了一些时间来理解, 为什么我要禁用 ListView 项中的链接, 但它有时会获得一个链接!

    您需要将该标志设置为所需的值 然后调用 setText(...)

    【讨论】:

    • 有点不清楚你在说什么。这是对问题的回答还是您想提出一个新问题?
    • 这主要是一个注释,因为我在搜索“Linkify textview in ListView”问题时发现了这个主题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多