Подтвердить что ты не робот

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);
    }
4b9b3361

Ответ 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;
            }
        }