Linkify Вопрос о преобразовании Android

Попытка сделать что-то довольно простое.

Берем такой текст

Имя пользователя: Это комментарий, который я делаю

Он находится в одном TextView. Я хочу сделать имя пользователя ссылкой. Я решил, что проще всего будет окружить имя пользователя чем-то вроде «$@», чтобы оно стало

"$@Имя пользователя:$@ Это комментарий, который я делаю

Таким образом, я могу использовать следующее регулярное выражение

Pattern userName = Pattern.compile(".*\\$@(.+)\\$@.*");

с Linkify и сделать ссылку. Однако, очевидно, мне нужно удалить разделители, поэтому следующий код

title.setText(titleText);
Linkify.TransformFilter transformer = new Linkify.TransformFilter() {

    @Override
    public String transformUrl(Matcher match, String url) {
       return match.group(1);
    }
};
Linkify.addLinks(title, userName, "content://user=", null,     transformer);

Однако по какой-то причине весь текст становится одной гигантской ссылкой, и текст вообще не трансформируется.


person Leo    schedule 20.06.2011    source источник


Ответы (3)


На самом деле это оказалось довольно легко. Я закончил тем, что не использовал сумасшедший "$@" для разделения имени пользователя, вместо этого придерживаясь только

Имя пользователя: Это комментарий, который я делаю

поэтому я использовал следующий шаблон

Pattern userName = Pattern.compile("(.+:)");

Очень просто, и код становится просто

title.setText(titleText);
Linkify.addLinks(title, GlobalUtil.userName, "user://" + userId + "/");

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

person Leo    schedule 22.06.2011

Мое лучшее предположение заключается в том, что регулярное выражение, которое вы используете, является проблемой, когда вы говорите ему в основном выбрать всю строку, если она соответствует, включая все до и после того, что вы ищете. Таким образом, TransformFilter, вероятно, передается вся совпавшая строка. transformUrl, насколько я могу судить, ожидает, что вы вернете URL-адрес, поэтому вся строка связана с первой группой соответствия.

Итак, имея это в виду, вероятно, в ваших интересах изменить регулярное выражение на что-то вроде строк "\\$@(.+?)\\$@" (с добавлением ? в группу, чтобы сделать соответствие нежадным), чтобы избежать сопоставления всей строки и просто выбор бита, который вы хотите преобразовать в URL (из-за отсутствия лучшего термина, плюс добавление -ize к словам звучит круто).

person Community    schedule 20.06.2011

Почему бы не поместить разделители внутри шаблона для изменения?

Pattern userName = Pattern.compile(".*(\\$@.+\\$@).*");

Затем измените фильтр преобразования, чтобы удалить начальный и конечный шаблоны при переходе на URL...

person Matthieu    schedule 20.06.2011