2013-11-27 9 views
6

У меня есть TextView, заполненный текстом, который я получаю с сервера. Я использую Linkify для обработки всего поиска ссылок и для настройки URLSpan, где это необходимо, во всем методе addLinks.Ручка нажимает на ссылки TextView при использовании Linkify для поиска и установки ссылок внутри текста

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

Я не вижу какой-либо метод Linkify, который позволит мне установить «OnClick» или что-то ...

Спасибо за вашу помощь :)

ответ

10

Хорошо, поэтому мне удалось установить собственный «OnClickListener» для ссылок TextView. Мое решение было скопировать Linkify в мой проект, назовите его CustomLinkify и просто изменить свой applyLink метод:

От:

private static final void applyLink(String url, int start, int end, Spannable text) 
{ 
    URLSpan span = new URLSpan(url); 

    text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 

To:

private static final void applyLink(final String url, int start, int end, Spannable text) 
{ 
    URLSpan span = new URLSpan(url) 
    { 
     @Override 
     public void onClick(View widget) 
     { 
      _onLinkClickListener.onLinkClicked(url); 
     } 
    }; 

    text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 

Где _onLinkClickListener новое поле, установленный мной перед использованием нового CustomLinkify.

Я знаю, что это не очень изящное решение, и я предпочитаю google, чтобы разрешить прослушивание через родной Linkify, но для меня это лучше, чем реализация моих собственных логик Spannable (как предложено в других связанных вопросах).

Я доверяю код Linkify, и я думаю, что время от времени проверю, были ли внесены какие-либо изменения на него, если это так, я обязательно обновлю CustomLinkify с изменениями.

Надеюсь, это поможет кому-то.

+0

Привет, Спасибо за решение, я пытался копировать Linkify.java в мой проект, но кажется, что он использует некоторые внешние библиотеки, такие как libcore.util.EmptyArray и com.android.i18n, которые нельзя импортировать в мой проект ,Можете ли вы разместить дополнительную информацию о том, как вам удалось это сделать. Благодарю. – user465125

-4

Может быть, вы должны использовать WebView вместо TextView ?

+0

Я не думаю, что использование webView для отображения текста со ссылками является решением. Но все равно спасибо. – Shirane85

+1

Но с помощью WebView вы можете самостоятельно обрабатывать свои клики. BTW: Переключение обходного пути является смешным. Вы не получите никаких дальнейших ответов от кого-либо в Satckoverflow, если вы обмениваетесь обходными решениями вместо плохих ответов. Возможно, вам нужно снова прочитать, как работают downvoting: http://stackoverflow.com/help/privileges/vote-down – kirsche40

+0

@ kirsche40 Downvoting доступен только после того, как вы прошли 125 репутации, у них есть только 51. – hichris123

2

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

Textoo С, это может быть как достичь:

TextView myTextView = Textoo 
    .config((TextView) findViewById(R.id.my_text_view)) 
    .linkifyEmailAddresses() 
    .linkifyMapAddresses() 
    .linkifyPhoneNumbers() 
    .linkifyWebUrls() // or just .linkifyAll() 
    .linkify(patternSettings, "internal://settings/") 
    .linkify(patternGoogle, "http://www.google.ie/search2?q=", null, transformFilter) 
    .linkify(patternGoogle, "http://www.google.ie/search3?q=", matchFilter, transformFilter) 
    .addLinksHandler(new LinksHandler() { 
     @Override 
     public boolean onClick(View view, String url) { 
      if ("internal://settings/location".equals(url)) { 
       Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(locSettings); 
       return true; 
      } else { 
       return false; 
      } 
     } 
    }) 
    .apply(); 

Просто поделиться и надеюсь, что кто-то найдет это полезным.