8

問題は、textViewをLinkifyすると、下にあるScrollViewが設定したスイープジェスチャをリッスンしないことです。下にあるビューのジェスチャをいじらずにLinkifyを使用する方法はありますか?ontouchEventをオーバーライドして、ACTION_MOVEにfalseを返そうとしましたが、スクロールビューのジェスチャが機能するには、ACTION_DOWNイベントとACTION_UPイベントが必要です。それを達成する方法はありますか?

4

3 に答える 3

47

LinkifytextView への MovementMethod に適用されLinkMovementMethodます。その移動メソッドは、親が持っている他のスクロールメソッドをオーバーライドする垂直方向のスクロールメソッドを実装していると考えました。親にディスパッチできますが touchEvent、特定の親は実行するためにScrollViewシーケンス全体、、を必要としましたACTION_DOWN(ACTION_MOVEスイープACTION_UP検出)。

したがって、私の問題の解決策は、Linkify の後で textView のスクロール メソッドを削除し、textView のLinkMovementMethodリンク検出アクションを処理することonTouchEventです。

@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 検出 (テキストビュー全体ではなく、ユーザーがリンクに触れた場合にのみ実行されます) があり、LinkMovementMethod 全体はありません。

于 2011-09-06T23:32:18.527 に答える
0

AutoLink フラグを利用した TextView::setText(...) メソッドには、小さな悪い点があります。

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(...) を呼び出す必要があります

于 2015-11-25T12:34:02.753 に答える