2011-01-20 2 views
25

У меня есть текстовое представление, которое мне нужно связать. Вот что я делаю ..Android: Linkify TextView

TextView text = (TextView) view.findViewById(R.id.name); 
text.setText("Android...Update from Android"); 
Pattern pattern = Pattern.compile("Android"); 
String scheme = "www.android.com"; 
Linkify.addLinks(text, pattern, scheme); 

Текст ракурса корректно отображается с текстом «Android ... Обновление от Android», но я столкнулся с двумя проблемами.

1) Моя текстовая строка содержит два экземпляра строки «Android». Таким образом, оба текста связаны. Я хочу, чтобы только первое возникновение было связано. Как мне это сделать?

2) Когда я нажимаю ссылку на текст, он открывает браузер, но URL-адрес странный. URL-адрес, который он пытается открыть, - «www.comandroid». Я не знаю, что здесь происходит. Текст «андроид» в URL-адресе заменяется. Я делаю что-то неправильно, когда Linknifying текст.

Любая помощь будет высоко оценена.

+3

Проблема решена. Решение первой проблемы - это ответ, предоставленный Яном Лесли. Решение второй проблемы заключается в следующем. Поведение API «Linkify.addLinks» таково, что оно добавляет строку, которую вы хотите связать с концом URL. Для ex..если вы хотите связать текст «Android» с «www.android.com» .. окончательный URL-адрес «www.android.comAndroid», который не то, что мне нужно. Так я использовал public static final void addLinks (TextView text, Pattern p, String scheme, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) –

+0

TransformFilter transformFilter = new TransformFilter() {public final Строка transformUrl (окончательное совпадение совпадений, строковый URL) { return ""; } }; Api transformFilter возвращает пустую строку. Таким образом, мой окончательный URL-адрес «www.android.com –

ответ

9

У меня нет большого опыта работы с Linkify. Пока что все, что я хотел сделать, это сделать URL-адреса в тексте ссылками, которые обрабатываются автоматически другой версией addLinks.

Однако регулярное выражение, которое вы используете, чтобы соответствовать на «Android» может быть изменен только соответствовать тому, который запускает строку щипая регулярное выражение:

Pattern pattern = Pattern.compile("^Android"); 

Обратите внимание на добавление «^». Это говорит правилу регулярного выражения, чтобы он соответствовал шаблону «Android», когда он запускает строку. Если это будет работать с вашими строками, тогда отлично. Если у вас есть другие случаи, слово, которое вы хотите связать, находится не в начале строки, вам нужно будет еще раз изучить регулярные выражения. Я рекомендую этот сайт, чтобы узнать больше regular-expressions.info

+1

Спасибо. Ваш ответ решил мою первую проблему. +1 для этого. –

5

Если вы хотите, чтобы открыть все URLs, который содержит в тексте, то вы можете сделать это ..

  TextView textview=(TextView)findViewById(R.id.text); 

    textview.setText("Android....Update from android...www.android.com"); 
    Linkify.addLinks(textview, Linkify.WEB_URLS); 
    textview.setMovementMethod(LinkMovementMethod.getInstance()); 

Это может работать для всех страниц.

17

Я создал статический метод, который делает это просто:

/** 
* Add a link to the TextView which is given. 
* 
* @param textView the field containing the text 
* @param patternToMatch a regex pattern to put a link around 
* @param link the link to add 
*/ 
public static void addLink(TextView textView, String patternToMatch, 
     final String link) { 
    Linkify.TransformFilter filter = new Linkify.TransformFilter() { 
     @Override public String transformUrl(Matcher match, String url) { 
      return link; 
     } 
    }; 
    Linkify.addLinks(textView, Pattern.compile(patternToMatch), null, null, 
      filter); 
} 

И OP может использовать его просто:

addLink(text, "^Android", "http://www.android.com"); 
+1

Я потратил немало времени, пытаясь понять, почему это не работает, только для того, чтобы понять, что когда автолинк включен, это не работает. Когда включена функция «автоссылки», все дополнительные операции Linkify игнорируются. В итоге я назвал 'text.setAutoLinkMask (0);' перед вызовом этой функции, и он выполнил как автолинк, так и этот обычай link: Я надеюсь, что это поможет кому-то еще, кто сталкивается с той же проблемой. –

2

Вот от Shawns ответ и комментарий SpunkerBaba, я пришел с этим вспомогательный класс. Это останавливает проблему двойного добавления того, что вы меняете, добавляя к вашему URL-адресу.

package com.your.package; 

public class Linkify { 

    /** 
    * @param textView 
    *   textView who's text you want to change 
    * @param linkThis 
    *   a regex of what text to turn into a link 
    * @param toThis 
    *   the url you want to send them to 
    */ 
    public static void addLinks(TextView textView, String linkThis, String toThis) { 
     Pattern pattern = Pattern.compile(linkThis); 
     String scheme = toThis; 
     android.text.util.Linkify.addLinks(textView, pattern, scheme, new MatchFilter() { 
      @Override 
      public boolean acceptMatch(CharSequence s, int start, int end) { 
       return true; 
      } 
     }, new TransformFilter() { 

      @Override 
      public String transformUrl(Matcher match, String url) { 
       return ""; 
      } 
     }); 
    } 

} 

Useage:

Linkify.addLinks(profileTextView, "BlundellApps.com", "http://www.BlundellApps.com"); 
+0

Работает отлично. Я просто использую это как функцию вместо класса. Спасибо! –

16

Простой способ ставится Автоссылка в макете XML.

android:autoLink="web" 
0

Проблема решена. Решение первой проблемы - это ответ, предоставленный Яном Лесли. Решение второй проблемы заключается в следующем. Поведение API «Linkify.addLinks» таково, что оно добавляет строку, которую вы хотите связать с концом URL. Для ex..если вы хотите связать текст «Android» с «www.android.com». Конечный URL - это «www.android.comAndroid», который мне не нужен.Так я использовал

public static final void addLinks (TextView text, Pattern p, String scheme, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) 
TransformFilter transformFilter = new TransformFilter() { 
public final String transformUrl(final Matcher match, String url) { 
return ""; 
} }; 

Api transformFilter возвращает пустую строку. Так что мой окончательный URL является «www.android.com»

+0

Можете ли вы отредактировать ур ответ с полным решением? – KJEjava48

+0

Какова должна быть ценность для matchFilter и transformFilter в Linkify.addLinks (текст, шаблон, схема, matchFilter, transformFilter); – KJEjava48

0
TextView noteView = (TextView) findViewById(R.id.noteview); 
noteView.setText(someContent); 
Linkify.addLinks(noteView, Linkify.ALL); 
0

Я думаю, что вам действительно нужно что-то так просто, как:

final TextView textView = ((BodyViewHolder) holder).textView; 
textView.setText(text); 
Linkify.addLinks(textView, Linkify.WEB_URLS); // I would do this only during view creation, btw. 

Вы отслеживаете URL специально. Некоторые люди предлагают использовать Linkigy.ALL, но вы не хотите:

public static final int ALL = WEB_URLS | EMAIL_ADDRESSES | PHONE_NUMBERS | MAP_ADDRESSES; 

Кроме того, другие люди предполагают, добавив:

textview.setMovementMethod(LinkMovementMethod.getInstance()); 

после добавления правила ссылки, но addLinks уже делает это в его внутренности ;-)

Cheers!

0

Для Koltin с лямбда-выражения, было бы, как этот

val pattern = Pattern.compile(link.title) 
Linkify.addLinks(view, pattern, null, null, { matcher, url -> link.href }) 

 Смежные вопросы

  • Нет связанных вопросов^_^