Есть ли способ создать собственные Spannables на Android?

В моем приложении для Android у меня есть текстовые представления со ссылками. Каждый из них переключает определенное событие (открытие браузера, запуск другого действия и т. д.). Чтобы справиться с этим, я не нашел лучшего решения, чем сделать это:

hi there!, this is <u>a action</u> and this is <b>another action</b>. This third one goes to <a href="http://google.com>Google</a>

Затем при отображении текстового представления я преобразовываю каждую ссылку в пользовательский spannable с помощью SpannableStringBuilder.

Я знаю, что это хаки. И вот почему я хочу знать, есть ли другой лучший способ?

У меня есть две идеи:

  • Можно ли реализовать пользовательские spannables с собственной системой сортировки? Например, настраиваемые совпадающие теги spannable, такие как:

    <div class="foo"></div>

Тогда у меня будет FooClickableSpannable расширение ClickableSpan, автоматически обнаруженное с помощью fromHtml()

  • Я мог бы использовать пользовательские схемы URL-адресов для открытия своих действий, но я не уверен, как заставить его не отображать средство выбора приложений, если есть другие альтернативы.

person Romain Piel    schedule 21.10.2012    source источник


Ответы (1)


Можно ли реализовать пользовательские spannables с собственной системой сортировки?

Можете ли вы создать собственные подклассы CharacterStyle, особенно ClickableSpan? да.

Однако я понятия не имею, что означает «их собственная система сортировки».

Я мог бы использовать пользовательские схемы URL-адресов для открытия своих действий, но я не уверен, как заставить его не отображать средство выбора приложений, если есть другие альтернативы.

Что ж, настоящая пользовательская схема (например, piel:// вместо http:// или content://) вряд ли предоставит возможность выбора, поскольку маловероятно, что будет другая альтернатива.

Помимо этого, то, что я сделал в прошлом, это:

  • Используйте Html.fromHtml() для базового преобразования
  • Используйте getSpans() в результатах, чтобы найти все URLSpan объекты.
  • заменил эти объекты URLSpan другими типами настраиваемых диапазонов, где это необходимо, через removeSpan() и setSpan()

Другим подходом было бы создание аналога для Html.fromHtml(). Это то, что гремит на нижних уровнях моего собственного списка TODO, чтобы создать что-то более расширяемое, поддерживающее больше HTML-конструкций и т. д.

person CommonsWare    schedule 21.10.2012
comment
спасибо за этот комментарий, я думаю, что ваш последний абзац — это то, что я хочу сделать в своем первом предложении (см. мой обновленный вопрос). Это на самом деле очень интересно, решение схемы данных — это быстрое решение, но может быть не самым чистым решением. Я попытаюсь посмотреть, как я могу сделать свой Html.fromHtml() похожим. - person Romain Piel; 21.10.2012
comment
@RomainPiel: Другая возможность — придумать совершенно новые теги, если этот контент не будет просматриваться за пределами вашего приложения. Таким образом, тег <piel>...</piel> обычно игнорируется, но вы можете прикрепить Html.TagHandler к вашему fromHtml() запросу, чтобы поймать это. К сожалению, <div> уже распознается синтаксическим анализатором и не различает через class, поэтому ваш TagHandler не получит управление, и для этого потребуется аналог fromHtml(). Но я заметил, что <span> в настоящее время не используется fromHtml(), так что это более совместимый со стандартами вариант без использования собственного синтаксического анализатора. - person CommonsWare; 21.10.2012
comment
интересно, не знал об этом TagHandler, ура! - person Romain Piel; 21.10.2012