2016-09-12 2 views
0

У меня есть TextView в моем макете с autoLink='web', и когда я нажимаю на него, открывается внутренний интернет-браузер с URL-адресом, который предоставляется в виде текста в этом TextView, и все хорошо. Я хочу сделать что-то еще с этим, то есть при открытии этого URL-адреса в браузере я хочу сделать некоторые дополнительные действия. Какой наименее болезненный способ это сделать?TextView поймает ссылку на ссылку, когда autoLink установлен на «web»

Бест,

Deveti

+1

Возможно, вы должны использовать 'SpannableString' –

+1

Проверьте это. http://stackoverflow.com/questions/12418279/android-textview-with-clickable-links-how-to-capture-clicks – peter

ответ

1

На самом деле,

Я решил эту проблему путем отказа от autolLink='web' и разбора HTML URL, создание SpannableString и установка дополнительных пролетов.

Итак, допустим, что я хочу сделать следующее:

  • , если пользователь нажимает на части текста TextView, который не является URL, метод someMethod() следует назвать
  • , если пользователь нажимает на часть текста TextView, который является URL, метод someMethod() следует назвать и браузер должен быть openned с заданным URL

Итак, первым мы имеем содержание, которое находится в переменной message и метод String extractFirstLink(String text) будет использоваться для получения URL-адреса.

private static String extractFirstLink(String text) { 
    Matcher m = Patterns.WEB_URL.matcher(text); 
    return m.find() ? m.group() : null; 
} 

Примечание: в моем случае я знаю, что у меня будет только один URL, но если вы можете ожидать более одного URL, это решение (найдено где-то на StackOverflow, не могу найти его прямо сейчас) будет делать работа:

public static String[] extractLinks(String text) { 
    List<String> links = new ArrayList<String>(); 
    Matcher m = Patterns.WEB_URL.matcher(text); 
    while (m.find()) { 
     String url = m.group(); 
     links.add(url); 
    } 
    return links.toArray(new String[links.size()]); 
} 

Итак, вот код:

int contentTextColor = ...; // color of non-url text in textView 
int urlTextColor = ...; 
String message = notification.getMessage(); // content stored 
final String foundLink = extractFirstLink(message); 
SpannableString styledString = new SpannableString(message); 

if (foundLink != null) { 
    int startPosition = message.indexOf(foundLink); 
    int endPosition = startPosition + foundLink.length(); 
    styledString.setSpan(new ForegroundColorSpan(urlTextColor), startPosition, endPosition, 0); 

    ClickableSpan clickableURLSpan = new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      someMethod(); 
      Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(foundLink)); 
      widget.getContext().startActivity(browserIntent); 
     } 
    }; 

    ClickableSpan clickableNonURLSpan1 = new ClickableSpan() { 
     @Override 
     public void onClick(View view) { 
      someMethod(); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      ds.setUnderlineText(false); 
     } 
    }; 
    ClickableSpan clickableNonURLSpan2 = new ClickableSpan() { 
     @Override 
     public void onClick(View view) { 
      someMethod(); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      ds.setUnderlineText(false); 
     } 
    }; 
    styledString.setSpan(clickableURLSpan, startPosition, endPosition, 0); 
    if (startPosition > 0) { 
     styledString.setSpan(clickableNonURLSpan1, 0, startPosition - 1, 0); 
     styledString.setSpan(new ForegroundColorSpan(contentTextColor), 0, startPosition -1, 0); 
    } 
    if (endPosition < message.length() -1) { 
     styledString.setSpan(clickableNonURLSpan2, endPosition + 1, message.length(), 0); 
     styledString.setSpan(new ForegroundColorSpan(contentTextColor), endPosition + 1, message.length(), 0); 
    } 

    txtView.setMovementMethod(LinkMovementMethod.getInstance()); 
} 

txtView.setText(styledString); 

есть некоторые интересные вещи здесь. Например, когда я хочу сделать диапазон чувствительным к клику, я должен использовать ClickableSpan, но! Я должен обрабатывать ситуацию, когда у меня есть формат text1-url-text2. Итак, поскольку все эти три части должны быть ClickableSpan s, а text1 и text2 не должны иметь подчеркивания, что является поведением по умолчанию, мне пришлось переопределить метод updateDrawState в моей реализации ClickableSpan для text1 и text2.

Существует еще один улов, мне пришлось создать две реализации интерфейса ClickableSpan, чтобы работать по назначению. Вот почему я создал clickableNonURLSpan1 и clickableNonURLSpan2.

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