TextView, который связывается и выбирается?
Я хотел бы иметь TextView
, который можно выбрать и связать. Когда я делаю оба, я получаю доступный текст, но ссылки не могут быть нажаты.
EDIT:
Я покажу код, чтобы объяснить, с чем я борюсь:
TextView textView = view.findViewById(R.id.mytext);
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah");
Linkify.addLinks(textView, Linkify.ALL);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
textView.setTextIsSelectable(true);
}
Ответы
Ответ 1
Вы пытались добавить это в свой XML-код TextView?
<TextView
...
android:autoLink="all"
android:textIsSelectable="true" />
Я пробовал это на своем коде, и я могу совершать вызов/серфинг по сети/почте, а также выбирать весь текст.
Ответ 2
Атрибут autoLink
имеет раздражающую ошибку: если вы нажмете в своем примере по номеру телефона, вернитесь назад и щелкните по второй ссылке URL-адреса - он снова откроет номер телефона. Этот атрибут работает так плохо с несколькими ссылками, что я реализовал свой собственный класс, вот ссылка на Github ClickableLinksTextView.java
В вашем примере вы можете заменить класс TextView
моим классом ClickableLinksTextView
в xml-макете и изменить код следующим образом:
ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext);
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah");
Linkify.addLinks(textView, Linkify.ALL);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
textView.setTextIsSelectable(true);
// the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0);
}
Первоначальная причина проблемы в вашем вопросе заключается в том, что класс LinkMovementMethod
и атрибут textIsSelectable
несовместимы вообще, даже разработчики ОС Android признают это в Android Исходный код ОС.
Не изменяйте метод перемещения текста, поддерживающего выбор текста, поскольку это предотвратит произвольное смещение курсора.
Если текстовое представление можно выбрать, только 2 правильных значения метода движения null
и ArrowKeyMovementMethod
. Поэтому я установил ArrowKeyMovementMethod
явно в моем примере, потому что Linkify.addLinks
устанавливает неправильный метод перемещения, и я должен его вернуть.
Что касается ошибки атрибута autoLink, это связано с тем, что разработчики Android не скопировали правильное определение ссылок. Вы можете посмотреть пример кода в ответе @cheng yang, код просто берет первую ссылку независимо от того, сколько из них у вас есть.
Ответ 3
Проблема в Android TextView
. Вызов Linkify.addLinks()
не изменит автомасштабирование в TextView
.
Я думаю, что это ошибка Android, которую они проверяют mAutoLinkMask.
Поэтому, если вы установите android:autoLink
в файле xml
или вызовите setAutoLinkMask()
значение не 0, оно будет работать.
FYI, TextView
исходный код:
if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) {
// The LinkMovementMethod which should handle taps on links has not been installed
// on non editable text that support text selection.
// We reproduce its behavior here to open links for these.
ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(),
getSelectionEnd(), ClickableSpan.class);
if (links.length > 0) {
links[0].onClick(this);
handled = true;
}
}