Android-将大型段落链接转换为spanURL
已尝试联机搜索。下面是我正在尝试做的一个例子: 文本视图中的文本是:“嘿,你好,检查这个链接:如果你不喜欢这个链接,试试这个链接,或者最后试试” 我想让所有这些链接都可以在列表视图中点击。我不想在textview对象上使用android:autoLink=“web”,因为列表项本身是可点击的,它们可能会消耗点击事件或造成混乱。我正在寻找一种方法来扫描文本,收集链接,然后将它们更改为spanURL。这样,只有文本才可以单击,而不是文本视图。如果有什么不同,这里是我现在拥有的listview行布局中的textview:Android-将大型段落链接转换为spanURL,android,url,textview,spannable,Android,Url,Textview,Spannable,已尝试联机搜索。下面是我正在尝试做的一个例子: 文本视图中的文本是:“嘿,你好,检查这个链接:如果你不喜欢这个链接,试试这个链接,或者最后试试” 我想让所有这些链接都可以在列表视图中点击。我不想在textview对象上使用android:autoLink=“web”,因为列表项本身是可点击的,它们可能会消耗点击事件或造成混乱。我正在寻找一种方法来扫描文本,收集链接,然后将它们更改为spanURL。这样,只有文本才可以单击,而不是文本视图。如果有什么不同,这里是我现在拥有的listview行布局中
<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" />
}
}
然后您可以创建linkifier类,我这样运行它:
链接器链接器=新链接器();
设置链接(myTextView,“我的消息”等)
textview必须已经包含文本,并且第二个参数与您要查找的文本相匹配。因此,如果myTextView包含“嘿,你好,请检查此链接:如果您不喜欢此链接,请尝试此链接或最终尝试”,那么第二个参数将使用相同的字符串 这也许有帮助,谢谢,我会投票给你的。
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);
}
}
}