Linkify Android Transform Вопрос - PullRequest
       12

Linkify Android Transform Вопрос

2 голосов
/ 20 июня 2011

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

Принимая такой текст

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

в одном 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);

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

Ответы [ 3 ]

1 голос
/ 22 июня 2011

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

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

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

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

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

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

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

0 голосов
/ 21 июня 2011

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

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

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

0 голосов
/ 21 июня 2011

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

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

...