Android Linkify lower cases the URL
I have a URL with some Upper case letters like http://myserver.com/apps/DroidApp.apk
When I passed this url to Android Linkify, the resulting link's letter case changed to http://myserver.com/apps/droidapp.apk
TextView upgradeLink = (TextView) findViewById(R.id.upgradeNow);
upgradeLink.setText("Download now.");
Pattern pattern = Pattern.compile("Download");
String scheme = "http://myser开发者_运维知识库ver.com/apps/DroidApp.apk+"?action=";
Log.e(MY_DEBUG_TAG,"Schema URL "+scheme); // printed http://myserver.com/apps/DroidApp.apk?action=
Linkify.addLinks(upgradeLink, pattern, scheme);
How can I over come this?
Internally, Linkify
is calling
public static final boolean addLinks(Spannable s, Pattern p, String scheme, null, null)
Check the code for that method:
public static final boolean addLinks(Spannable s, Pattern p,
String scheme, MatchFilter matchFilter,
TransformFilter transformFilter) {
boolean hasMatches = false;
String prefix = (scheme == null) ? "" : scheme.toLowerCase(); // <-- here is the problem!
Matcher m = p.matcher(s);
while (m.find()) {
int start = m.start();
int end = m.end();
boolean allowed = true;
if (matchFilter != null) {
allowed = matchFilter.acceptMatch(s, start, end);
}
if (allowed) {
String url = makeUrl(m.group(0), new String[] { prefix },
m, transformFilter);
applyLink(url, start, end, s);
hasMatches = true;
}
}
return hasMatches;
}
Extend Linkify
and override this method, removing the scheme.toLowerCase()
bit.
You can add helper function to change the urls modified by Linkify
/***
* hyperlinks @toThis to @linkThis in the given @textView
***/
fun addLinks(textView: TextView, linkThis: String, toThis: String) {
val pattern = Pattern.compile(linkThis, Pattern.CASE_INSENSITIVE)
android.text.util.Linkify.addLinks(textView, pattern, toThis, { s, start, end -> true }, { match, url -> "" })
//Maintain url case
val spanText = textView.text
if(spanText !is Spannable) return // no need to process since there are no URLSpans
val matcher = pattern.matcher(linkThis)
while (matcher.find()) {
val span = spanText.getSpans(matcher.start(), matcher.end(), URLSpan::class.java).first()
val spanFlags = spanText.getSpanFlags(span)
spanText.removeSpan(span) //remove modified url added by linkify
spanText.setSpan(URLSpan(toThis), matcher.start(), matcher.end(), spanFlags) //add the original url
}
textView.text = spanText
}
精彩评论