Making EditTexts with links both clickable and editable

Recently, I was working on an EditText that supports links. That is, users can add URLs that become clickable when not editing.

When the EditText is not focused, the links should be clickable. However, when it is focused, it should disable the links so that the user can edit them without opening them.

It's simple enough to add an OnFocusChangeListener for mode switching, but how does the user actually go about changing the focus (since clicking on the link would normally cause the browser to open)?

Long presses are one method. A second method should be to just click on any blank space in the EditText, like so:

Unfortunately, due to the behavior of LinkMovementMethod, if the last part of the text is a link, clicking anywhere causes the link to be opened.

My workaround hinged on the observation that this problem only happened if the last character of the text was a link. What if I added something after the text?

// Make links in the EditText clickable

// Setup my Spannable with clickable URLs
Spannable spannable = new SpannableString("");  
Linkify.addLinks(spannable, Linkify.WEB_URLS);

// The fix: Append a zero-width space to the Spannable
CharSequence text = TextUtils.concat(spannable, "\u200B");

// Use it!

Now clicking the empty space doesn't cause the link to be opened and I can switch into edit mode!

comments powered by Disqus