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
editText.setMovementMethod(LinkMovementMethod.getInstance());
// Setup my Spannable with clickable URLs
Spannable spannable = new SpannableString("http://blog.danlew.net");
Linkify.addLinks(spannable, Linkify.WEB_URLS);
// The fix: Append a zero-width space to the Spannable
CharSequence text = TextUtils.concat(spannable, "\u200B");
// Use it!
editText.setText(text);
Now clicking the empty space doesn't cause the link to be opened and I can switch into edit mode!