Android TextView Linkify перехватывает с родительским жестом просмотра

Проблема в том, что если я свяжусь с textView, то подстрочный просмотр не будет прослушивать жесты с разверткой, которые я установил. Есть ли способ связать без взаимодействия с жестов представления underliyng? Я попытался переопределить ontouchEvent и вернуть значение false в ACTION_MOVE, но для жестов scrollview для работы ACTION_DOWN и ACTION_UP требуется. Есть ли способ достичь этого?

Ответ 1

Linkify применяется к методу motionMethod для textView LinkMovementMethod. Этот метод движения считал, что он реализует вертикальный метод прокрутки, который переопределяет любой другой метод прокрутки, который имеет родитель. Хотя touchEvent может быть передано родительскому объекту, конкретному родительскому элементу ScrollView понадобилась вся последовательность ACTION_DOWN, ACTION_MOVE, ACTION_UP для выполнения (определение развертки).

Итак, решение моей проблемы после Linkify для удаления метода прокрутки 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.

Ответ 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 (...)