Android -Конвертировать ссылки большого абзаца в spanURL
Пробовал онлайн поиск уже. Вот пример того, что я пытаюсь сделать:
текст в текстовом виде: "эй, как дела, проверь эту ссылку: http://www.google.com/ и если тебе не нравится эта ссылка, попробуй эту ссылку http://yahoo.com/ или, наконец, попробуй http://tinyurl.com/wp-tinyurl"
Я хотел бы сделать все эти ссылки кликабельными в виде списка. Я не хочу использовать android:autoLink="web" для объекта textview, так как сам элемент списка является интерактивным, и он может использовать событие click или вызвать путаницу. Я ищу способ сканировать текст и собирать ссылки, а затем изменить их на spanURL, таким образом, становится доступным только текст, а не просмотр текста. если это имеет какое-то значение, вот текстовое представление в макете строки моего списка, которое у меня есть сейчас:
<TextView
android:id="@+id/tv_user_response"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:autoLink="web"
android:descendantFocusability="blocksDescendants"
android:textColor="@color/grey_font"
android:textSize="14sp" />
но я считаю, что я должен справиться с этим программно.
ОБНОВЛЕНИЕ: благодаря ссылке, предоставленной здесь, что я закончил делать:
public class Linkifier {
public TextView setLinks(TextView tv, String text) {
String[] linkPatterns = {
"([Hh][tT][tT][pP][sS]?:\\/\\/[^ ,'\">\\]\\)]*[^\\. ,'\">\\]\\)])",
"#[\\w]+", "@[\\w]+" };
for (String str : linkPatterns) {
Pattern pattern = Pattern.compile(str);
Matcher matcher = pattern.matcher(tv.getText());
while (matcher.find()) {
int x = matcher.start();
int y = matcher.end();
final android.text.SpannableString f = new android.text.SpannableString(
tv.getText());
InternalURLSpan span = new InternalURLSpan();
span.text = text.substring(x, y);
f.setSpan(span, x, y,
android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(f);
// tv.setOnLongClickListener(span.l);
}
}
tv.setLinkTextColor(Color.BLUE);
tv.setLinksClickable(true);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setFocusable(false);
return tv;
}
class InternalURLSpan extends android.text.style.ClickableSpan {
public String text;
@Override
public void onClick(View widget) {
Utils.createToast(widget.getContext(),text);
handleLinkClicked(widget.getContext(),text);
}
public void handleLinkClicked(Context context,String value) {
if (value.startsWith("http")) { // handle http links
} else if (value.startsWith("@")) {
// handle @links
} else if (value.startsWith("#")) { // handle #links
String searchTerm=text.replace("#", "");
String query = null;
try {
query = URLEncoder.encode(text, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(Consts.URL_TWITTER_SEARCH+query));
context.startActivity(browserIntent);
}
}
}
}
затем вы можете создать класс линкера, и я запустил его так: Linkifier linkifier= new Linkifier(); linkifier.setLinks(myTextView, "мое сообщение и т. д.");
текстовое представление должно содержать текст, а второй параметр соответствует тому, какой текст вы ищете. так что, если myTextView содержит "эй, как дела, проверьте эту ссылку: http://www.google.com/ и если вам не нравится эта ссылка, попробуйте эту ссылку http://yahoo.com/ или, наконец, попробуйте http://tinyurl.com/wp-tinyurl", то второй параметр положить ту же строку.