Android Linkify и веб, и @mentions все в одном TextView - PullRequest
14 голосов
/ 05 января 2011

Хорошо, поэтому я спросил это вчера:

AutoLink @mentions в клиенте Twitter

Я получил правильные ссылки @mentions.Но чтобы заставить его работать, мне пришлось взять android: autoLink = "web" из моего xml для TextView.Так что теперь я получаю ссылки на @mentions, но он больше не ссылается на URL.Я попытался сделать два отдельных вызова Linkify.addLinks (), как это:

mentionFilter = new TransformFilter() {
    public final String transformUrl(final Matcher match, String url) {
        return match.group(1);
    }
};

// Match @mentions and capture just the username portion of the text.
//pattern = Pattern.compile("@([A-Za-z0-9_-]+)");
pattern = Pattern.compile("(@[a-zA-Z0-9_]+)");
scheme = "http://twitter.com/";

tweetTxt = (TextView) v.findViewById(R.id.tweetTxt);


Linkify.addLinks(tweetTxt, pattern, scheme, null, mentionFilter);
Linkify.addLinks(tweetTxt, Linkify.WEB_URLS);

Но то, что всегда вызывается последним, это тот, который применяется.Может кто-нибудь сказать мне, как я могу сделать так, чтобы он связывал @mentions и все еще автоматически связывал URL-адреса?

Отредактировано, чтобы уточнить еще немного кода.

Ответы [ 6 ]

31 голосов
/ 13 апреля 2012

Вот мой код для ссылки на все ссылки Twitter (упоминания, хэштеги и URL):

TextView tweet = (TextView) findViewById(R.id.tweet);

TransformFilter filter = new TransformFilter() {
    public final String transformUrl(final Matcher match, String url) {
        return match.group();
    }
};

Pattern mentionPattern = Pattern.compile("@([A-Za-z0-9_-]+)");
String mentionScheme = "http://www.twitter.com/";
Linkify.addLinks(tweet, mentionPattern, mentionScheme, null, filter);

Pattern hashtagPattern = Pattern.compile("#([A-Za-z0-9_-]+)");
String hashtagScheme = "http://www.twitter.com/search/";
Linkify.addLinks(tweet, hashtagPattern, hashtagScheme, null, filter);

Pattern urlPattern = Patterns.WEB_URL;
Linkify.addLinks(tweet, urlPattern, null, null, filter);
8 голосов
/ 16 января 2013

Мне пришлось Linkify.ALL, прежде чем Linkify-й @ упоминает, чтобы он работал.

Кроме того, не используйте «android: autoLink» в TextView в файле макета XML

TextView textView = (TextView) findViewById(R.id.tweet);

Pattern atMentionPattern = Pattern.compile("@([A-Za-z0-9_]+)");
String atMentionScheme = "http://twitter.com/";

TransformFilter transformFilter = new TransformFilter() {
        //skip the first character to filter out '@'
        public String transformUrl(final Matcher match, String url) {
                return match.group(1);
        }
};

Linkify.addLinks(textView, Linkify.ALL);
Linkify.addLinks(textView, atMentionPattern, atMentionScheme, null, transformFilter);

Мой TextView выглядит так:

<TextView 
    android:id="@+id/tweet"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:textColorLink="#449def"/>
6 голосов
/ 12 января 2011

Хорошо, наконец-то есть время правильно добавить @mention и #hashtags в класс Linkify.Вместо того, чтобы просто переопределять некоторые другие типы ссылок, чтобы заставить его работать.

Этот класс работает так же, как обычный Linkify, но также может выполнять эти две вещи.

2 голосов
/ 05 января 2011

Я нашел способ сделать эту работу.Это немного хакерский, но он сделал свою работу.Если кто-нибудь знает о более подходящем способе сделать это, пожалуйста, дайте мне знать.

Чтобы он заработал, я сделал копию класса Linkify и отредактировал часть, которая обрабатывает ссылки для телефонных номеров, чтобы сделать @Вместо этого упоминайте ссылки.

Вот где я нашел свою копию класса ссылок

Я изменил это:

if ((mask & PHONE_NUMBERS) != 0) {
            gatherLinks(links, text, Regex.PHONE_PATTERN,
                new String[] { "tel:" },
                sPhoneNumberMatchFilter, sPhoneNumberTransformFilter);
        }

на это:

if ((mask & PHONE_NUMBERS) != 0) {
    gatherLinks(links, text, Pattern.compile("@([A-Za-z0-9_-]+)"),
        new String[] { "http://www.twitter.com/" },
        null, null);
}

Я вызвал этот класс MyLinkify и использовал этот код в своей Деятельности, чтобы применить ссылки.

MyLinkify.addLinks(tweetTxt, Linkify.ALL);

Чтобы получить класс MyLinkify для сборки, мне также пришлось добавить копиюКласс Regex в моем проекте, , вот где я нашел Regex.java

Я помещаю это как ответ, если кто-то еще ищет этот эффект, найдет эту тему.Я понял, что это, вероятно, не лучший способ заставить это работать.Если кто-нибудь знает лучший способ заставить его работать, пожалуйста, добавьте его сюда, и я выберу именно тот ответ на этот вопрос.

1 голос
/ 17 февраля 2012

используйте ниже код:

 TextView textView =  (TextView) findViewById(R.id.hello);
        String str = "@aman_vivek how are u  #aman_vivek <http://www.google.com> <http://www.tekritisoftware.com>";
        textView.setText(str);
        Pattern wikiWordMatcher = Pattern.compile("(@[a-zA-Z0-9_]+)");
        String wikiViewURL =    "http://www.twitter.com/";
        Linkify.addLinks(textView, wikiWordMatcher, wikiViewURL);


        Pattern wikiWordMatcher1 = Pattern.compile("\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
        Linkify.addLinks(textView, wikiWordMatcher1, null);
0 голосов
/ 05 января 2011

Является ли tweetTxt входной строкой, которую вы связываете, или дескриптором объекта TextView?Если это входная строка, то вы просто перезаписываете TextView выводом последнего вызова addLinks.Учитывая ваше наблюдение, я предполагаю, что это так.

Вам нужно передать TextView для addLinks в обоих случаях.Внутренне Linkify будет извлекать буфер Spanned из TextView и использовать его так, чтобы множественные вызовы addLinks были накопительными.Пример WikiNotes передает TextView, и вы должны: http://developer.android.com/resources/articles/wikinotes-linkify.html

...