I have a String that contains HTML tags which I display in a TextView
JavaScript
x
Spanned text;
String htmlText = "<p dir="ltr">It was a great day with <a href="52">Julius</a> and <a href="18">Stanley</a></p>";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
text = Html.fromHtml(htmlText, Html.FROM_HTML_MODE_COMPACT);
else
text = Html.fromHtml(htmlText);
textView.setText(text);
Now I want those links to be clickable, and not just clickable, but to startup an Activity when clicked. The href
attributes have numbers which I want to pass as a parameter to my Intent
to start my Activity.
I use JSoup
to extract the values of the href
like this:
JavaScript
Document doc = Jsoup.parse(htmlText, "UTF-8");
Elements elements = doc.getElementsByTag("a");
for(int e = 0; e < elements.size(); e++){
Element element = elements.get(e);
String href = element.attr("href");
}
So I was hoping I can get a ClickEventListener
on the links and start the activity like this:
JavaScript
element.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, NewActivity.class);
Bundle userParams = new Bundle();
userParams.putString("userId", href);
intent.putExtras(userParams);
startActivity(intent);
}
});
I know element
is not a ViewGroup
so it can’t be done like my code shows, but is there any possible way of achieving this?
Advertisement
Answer
Search and I got an answer from here
JavaScript
String htmlText = "<p dir="ltr">It was a great day with <a href="52">Julius</a> and <a href="18">Stanley</a></p>";
CharSequence sequence = Html.fromHtml(htmlText);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
for(URLSpan span : urls) {
makeLinkClickable(strBuilder, span);
}
textView.setText(strBuilder);
textView.setMovementMethod(LinkMovementMethod.getInstance());
And then the makeLinkClickable
method to handle the links
JavaScript
protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span){
int start = strBuilder.getSpanStart(span);
int end = strBuilder.getSpanEnd(span);
int flags = strBuilder.getSpanFlags(span);
ClickableSpan clickable = new ClickableSpan() {
public void onClick(View view) {
String href span.getURL();
Intent intent = new Intent(context, NewActivity.class);
Bundle userParams = new Bundle();
userParams.putString("userId", href);
intent.putExtras(userParams);
startActivity(intent);
}
};
strBuilder.setSpan(clickable, start, end, flags);
strBuilder.removeSpan(span);
}