В настоящее время я отрисовываю ввод HTML в TextView следующим образом:
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
Отображаемый HTML-код предоставляется мне через внешний ресурс, поэтому я не могу изменить положение вещей, как я буду, но я, конечно, могу сделать какое-то вмешательство в HTML, чтобы изменить значение href, скажем, на что-то другое.
Я хочу иметь возможность обрабатывать щелчок по ссылке непосредственно из приложения, а не открывать окно браузера. Это вообще достижимо? Я предполагаю, что было бы возможно установить протокол значения href на что-то вроде «myApp: //», а затем зарегистрировать что-то, что позволило бы моему приложению обрабатывать этот протокол. Если это действительно лучший способ, я хотел бы знать, как это сделать, но я надеюсь, что есть более простой способ сказать: «Когда в этом текстовом просмотре нажата ссылка, я хочу вызвать событие, которое получает значение ссылки в качестве входного параметра
Ответы:
Подходя к этому почти год спустя, я решил свою проблему по-другому. Поскольку я хотел, чтобы ссылка обрабатывалась моим собственным приложением, есть решение, которое немного проще.
Помимо фильтра намерений по умолчанию, я просто позволяю своей целевой деятельности прослушивать
ACTION_VIEW
намерения, в частности, те, которые имеют схемуcom.package.name
Это означает, что ссылки, начинающиеся с,
com.package.name://
будут обрабатываться моей деятельностью.Поэтому все, что мне нужно сделать, это создать URL-адрес, содержащий информацию, которую я хочу передать:
В моей целевой деятельности я могу получить этот адрес:
В моем примере я мог бы просто проверить
data
наличие нулевых значений, потому что, когда оно не равно нулю, я буду знать, что оно вызывалось с помощью такой ссылки. Оттуда я извлекаю необходимые инструкции из URL, чтобы иметь возможность отображать соответствующие данные.источник
getData
дает вам полный URI, вы также можете использовать это,getDataString
чтобы получить текстовое представление. В любом случае, вы можете сконструировать URL так, чтобы он содержал все необходимые данныеcom.package.name://my-action/1/2/3/4
, и вы могли бы извлечь информацию из этой строки.Uri data = getIntent().getData();
? Я продолжаю получатьActivity not found to handle intent
ошибку. - СпасибоДругой способ, немного заимствует из Linkify, но позволяет вам настроить обработку.
Пользовательский класс Span:
Вспомогательная функция:
Использование:
источник
если в текстовом представлении есть несколько ссылок. Например, у textview есть «https: //» и «tel no», мы можем настроить метод LinkMovement и обрабатывать клики для слов на основе шаблона. Прилагаемый метод перемещения ссылок.
Это должно быть вызвано из textview следующим образом:
источник
widget.getContext()
вместо этого.Вот более общее решение, основанное на ответе @Arun
Чтобы использовать это просто реализовать
onLinkClick
вTextViewLinkHandler
классе. Например:источник
очень просто добавьте эту строку в ваш код:
источник
Решение
Я реализовал небольшой класс, с помощью которого вы можете обрабатывать длинные щелчки по самому TextView и нажатие на ссылки в TextView.
раскладка
TextViewClickMovement.java
использование
связи
Надеюсь это поможет! Вы можете найти код здесь .
источник
Просто чтобы поделиться альтернативным решением, используя библиотеку, которую я создал. С Textoo это может быть достигнуто как:
Или с динамическим источником HTML:
источник
для тех, кто ищет больше вариантов, вот один
РЕСУРС: CodePath
источник
источник
Я изменил цвет TextView на синий, используя, например:
в XML-файле. Как это сделать, подчеркнуто здесь .
Затем используйте его свойство onClick, чтобы указать метод (я думаю, вы могли бы вызвать его
setOnClickListener(this)
как-то иначе), например:В этом методе я могу делать все, что захочу, как обычно, например запуск намерения. Обратите внимание, что вы все равно должны делать обычные
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
вещи, как в методе onCreate () вашей активности.источник
Этот ответ расширяет превосходное решение Джонатана С.
Вы можете использовать следующий метод для извлечения ссылок из текста:
Это можно использовать для удаления одного из параметров в
clickify()
методе:Несколько изменений в ClickSpan:
Теперь вы можете просто установить текст в TextView и затем добавить слушателя к нему:
источник
Лучший способ, которым я пользовался, и он всегда работал для меня
источник
Пример. Предположим, вы установили какой-то текст в текстовом представлении и хотите указать ссылку на определенное текстовое выражение: «Нажмите на #facebook, и вы попадете на facebook.com».
В макете XML:
В деятельности:
Также создайте один поставщик тегов как:
В файле манифеста сделайте запись для провайдера и тестовую деятельность как:
Теперь, когда вы нажмете на #facebook, он вызовет тестирование. И в тестовой деятельности вы можете получить данные как:
источник