На самом деле,
Я решил эту проблему путем отказа от 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
.
Возможно, вы должны использовать 'SpannableString' –
Проверьте это. http://stackoverflow.com/questions/12418279/android-textview-with-clickable-links-how-to-capture-clicks – peter