Android autolink слишком агрессивна

Телефоны с SDK 20+ считают, что любые два слова с точкой между ними являются ссылкой. Как я могу сделать свой собственный детектор Link?

android:autoLink="web" считает, что abra.kadabra – это URL.

setAutoLinkMask(Linkify.WEB_URLS); Думает, что abra.kadabra – это URL.

Телефоны с SDK <20 все правильно связывают, ошибка происходит только тогда, когда SDK равен 20+.

Примеры того, что я пробовал:

Код происходит внутри моего пользовательского TextView

 SpannableString ss = new SpannableString(this.getText().toString()); //LinkManager is a copy of Linkify but with another pattern. LinkManager.addLinks(ss, LinkManager.WEB_URLS); setText(ss); setMovementMethod(LinkMovementMethod.getInstance()); setWebLinksTouchFeedback(); 

Это ничего не связывало. Даже когда я использую Linkify вместо LinkManager

Я пробовал много других решений, все, что в конечном итоге не связано ни с чем. Любое решение там?

Вы можете сделать свой собственный детектор ссылок, используя классы Matcher и Pattern и сделать их кликабельными с помощью ClickableSpan .

 String text = textView.getText().toString(); int i=0; SpannableString spannableString = new SpannableString(text); Matcher urlMatcher = Patterns.WEB_URL.matcher(text); while(urlMatcher.find()) { String url = urlMatcher.group(i); int start = urlMatcher.start(i); int end = urlMatcher.end(i++); spannableString.setSpan(new GoToURLSpan(url), start, end, 0); } textView.setText(spannableString); textView.setMovementMethod(new LinkMovementMethod()); 

 private static class GoToURLSpan extends ClickableSpan { String url; public GoToURLSpan(String url){ this.url = url; } public void onClick(View view) { Uri webPage = Uri.parse(url); //http:<URL> or https:<URL> Intent intent = new Intent(Intent.ACTION_VIEW, webPage); view.getContext().startActivity(intent); } } 

 <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/text" android:text="Link http://google.com but dont link abra.kadabra" android:textColorLink="@color/accent" android:textColorHighlight="@color/accent" /> 

Замените Pattern.WEB_URL своим. Вы можете найти некоторые шаблоны url в StackOverflow.

Я сам исправил это, вызвав этот метод перед супер-методом setText, так как все тексты, которые я хочу связать, задаются динамически.

 private void linkifyTexts(CharSequence charsequence) { String text = charsequence.toString(); String[] parts = text.split("\\s+"); for (int i = 0; i < parts.length; i++) { boolean isUrl = isURLValid(parts[i]); if (isUrl) { setAutoLinkMask(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES); setWebLinksTouchFeedback(); break; } } } public boolean isURLValid(String url) { Pattern p = Pattern.compile(getContext().getString(R.string.url_pattern)); return p.matcher(url).matches(); } 

С пользовательским шаблоном для URL-адресов, которые я хочу принять. Спасибо за помощь, я ценю это.

Intereting Posts
Расчет расстояния от моего местоположения до места назначения в андроиде Как использовать API Android KeyStore с API 18? Пример Android openGL дает пустой экран Как эмуляция карт на основе программного обеспечения (HCE) гарантирует безопасность NFC? Установить позицию текстового курсора на основе пользовательской позиции касания Android Форма дизайна материалов для Android Android: могу ли я предотвратить создание Java-класса (из внешней библиотеки) во время выполнения Вертикальное выравнивание содержимого в Android EditText Как сделать HTTPS-вызовы с помощью AsyncHttpClient? Почему мы можем вызвать getActivity () в onCreateView, который выполняется до onActivityCreated? Не удалось получить неизвестное свойство 'processReleaseGoogleServices' Как открыть альбом в приложении «Галерея», используя намерение Как увидеть предупреждения Gradle на Android Studio? Передача значений в ожидании намерений Android Как изменить значок APP динамически в android