Created
April 29, 2015 15:01
-
-
Save JSBerrocoso/f79b8ee6c543a4dc88be to your computer and use it in GitHub Desktop.
Android Custom Hyperlinked TextView
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.ArrayList; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
import android.content.Context; | |
import android.text.Spannable; | |
import android.text.SpannableString; | |
import android.text.style.ClickableSpan; | |
import android.util.AttributeSet; | |
import android.view.View; | |
import android.widget.TextView; | |
public class LinkEnabledTextView extends TextView | |
{ | |
// The String Containing the Text that we have to gather links from private SpannableString linkableText; | |
// Populating and gathering all the links that are present in the Text | |
private ArrayList<Hyperlink> listOfLinks; | |
// A Listener Class for generally sending the Clicks to the one which requires it | |
TextLinkClickListener mListener; | |
// Pattern for gathering @usernames from the Text | |
Pattern screenNamePattern = Pattern.compile('(@[a-zA-Z0-9_]+)'); | |
// Pattern for gathering #hasttags from the Text | |
Pattern hashTagsPattern = Pattern.compile('(#[a-zA-Z0-9_-]+)'); | |
// Pattern for gathering http:// links from the Text | |
Pattern hyperLinksPattern = Pattern.compile('([Hh][tT][tT][pP][sS]?:\\/\\/[^ ,'\'>\\]\\)]*[^\\. ,'\'>\\]\\)])'); | |
public LinkEnabledTextView(Context context, AttributeSet attrs) | |
{ | |
super(context, attrs); | |
listOfLinks = new ArrayList<Hyperlink>(); | |
} | |
public void gatherLinksForText(String text) | |
{ | |
linkableText = new SpannableString(text); | |
//gatherLinks basically collects the Links depending upon the Pattern that we supply | |
//and add the links to the ArrayList of the links | |
gatherLinks(listOfLinks, linkableText, screenNamePattern); | |
gatherLinks(listOfLinks, linkableText, hashTagsPattern); | |
gatherLinks(listOfLinks, linkableText, hyperLinksPattern); | |
for(int i = 0; i< listOfLinks.size(); i++) | |
{ | |
Hyperlink linkSpec = listOfLinks.get(i); | |
android.util.Log.v('listOfLinks :: ' + linkSpec.textSpan, 'listOfLinks :: ' + linkSpec.textSpan); | |
// this process here makes the Clickable Links from the text | |
linkableText.setSpan(linkSpec.span, linkSpec.start, linkSpec.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); | |
} | |
// sets the text for the TextView with enabled links | |
setText(linkableText); | |
} | |
// sets the Listener for later click propagation purpose | |
public void setOnTextLinkClickListener(TextLinkClickListener newListener) | |
{ | |
mListener = newListener; | |
} | |
//The Method mainly performs the Regex Comparison for the Pattern and adds them to | |
//listOfLinks array list | |
private final void gatherLinks(ArrayList<Hyperlink> links, | |
Spannable s, Pattern pattern) | |
{ | |
// Matcher matching the pattern | |
Matcher m = pattern.matcher(s); | |
while (m.find()) | |
{ | |
int start = m.start(); | |
int end = m.end(); | |
// Hyperlink is basically used like a structure for storing the information about | |
// where the link was found. | |
Hyperlink spec = new Hyperlink(); | |
spec.textSpan = s.subSequence(start, end); | |
spec.span = new InternalURLSpan(spec.textSpan.toString()); | |
spec.start = start; | |
spec.end = end; | |
links.add(spec); | |
} | |
} | |
// This is class which gives us the clicks on the links which we then can use. | |
public class InternalURLSpan extends ClickableSpan | |
{ | |
private String clickedSpan; | |
public InternalURLSpan (String clickedString) | |
{ | |
clickedSpan = clickedString; | |
} | |
@Override | |
public void onClick(View textView) | |
{ | |
mListener.onTextLinkClick(textView, clickedSpan); | |
} | |
} | |
// Class for storing the information about the Link Location | |
class Hyperlink | |
{ | |
CharSequence textSpan; | |
InternalURLSpan span; | |
int start; | |
int end; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.view.View; | |
public interface TextLinkClickListener | |
{ | |
// This method is called when the TextLink is clicked from LinkEnabledTextView | |
public void onTextLinkClick(View textView, String clickedString) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.text.method.MovementMethod; | |
import com.umundoinc.Tvider.Component.LinkEnabledTextView.LinkEnabledTextView; | |
import com.umundoinc.Tvider.Component.LinkEnabledTextView.TextLinkClickListener; | |
import android.app.Activity; | |
import android.graphics.Color; | |
import android.os.Bundle; | |
import android.text.method.LinkMovementMethod; | |
import android.view.View; | |
//Here the Activity is implementing the TextLinkClickListener the one we have created | |
//the Clicks over the Links are forwarded over here from the LinkEnabledTextView | |
public class TextViewActivity extends Activity implements TextLinkClickListener | |
{ | |
private LinkEnabledTextView check; | |
protected void onCreate(Bundle savedInstance) | |
{ | |
super.onCreate(savedInstance); | |
String text = "This is a #test of regular expressions with http://example.com/ links as used in @twitter for performing various operations based on the links this handles multiple links like http://this_is_fun.com/ and #Awesomess and @Cool"; | |
check = new LinkEnabledTextView(this, null); | |
check.setOnTextLinkClickListener(this); | |
check.gatherLinksForText(text); | |
check.setTextColor(Color.WHITE); | |
check.setLinkTextColor(Color.GREEN); | |
MovementMethod m = check.getMovementMethod(); | |
if ((m == null) || !(m instanceof LinkMovementMethod)) { | |
if (check.getLinksClickable()) { | |
check.setMovementMethod(LinkMovementMethod.getInstance()); | |
} | |
} | |
setContentView(check); | |
} | |
public void onTextLinkClick(View textView, String clickedString) | |
{ | |
android.util.Log.v('Hyperlink clicked is :: ' + clickedString, 'Hyperlink clicked is :: ' + clickedString); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment