Как определить, была ли затронута ссылка или простой текст в TextView - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть TextView, который может содержать кликабельную ссылку.Я хочу добавить прослушиватель щелчков в TextView, но все же, когда ссылка нажата, я хочу, чтобы Linkify обрабатывал ее как обычно.

1 Ответ

0 голосов
/ 06 сентября 2018

Мне потребовалось некоторое время, чтобы понять это, и я хотел поделиться ответом, так как он работал хорошо, так что наслаждайтесь!

Этот код пересекает строку, разделяя символы на пробел: "".

Затем проверяется каждое слово для ссылки.

TextView textView = new TextView(context) {
        @Override
        public boolean onTouchEvent(MotionEvent event) {

            final String text = getText().toString();
            final SpannableString spannableString = new SpannableString(text);
            Linkify.addLinks(spannableString, Linkify.ALL);
            final URLSpan[] spans = spannableString.getSpans(0, text.length(), URLSpan.class);

            final int indexOfCharClicked = getOffsetForPosition(event.getX(), event.getY()) + 1; //Change 0-index to 1-index

            final String [] words = text.split(" ");

            int numCharsTraversed = 0;

            //Find the word that was clicked and check if it's a link
            for (String word : words) {
                if (numCharsTraversed + word.length() < indexOfCharClicked) {
                    numCharsTraversed += word.length() + 1; // + 1 for the space
                } else {
                    for (URLSpan span : spans) {
                        if (span.getURL().contains(word) || word.contains(span.getURL())) {
                            //If the clicked word is a link, calling super will invoke the appropriate action
                            return super.onTouchEvent(event);
                        }
                    }
                    break;
                }
            }

            //If we're here, it means regular text was clicked, not a link
            doSomeAction();
            return true;
        }

    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...