TextView - как отображать простые URL-адреса и гиперссылки - PullRequest
0 голосов
/ 21 мая 2018

Две входные строки, например:

1.Ввод гиперссылки:

"<a href=\"https://blog.twitter.com/official/en_us/topics/company/2018/keeping-your-account-secure.html\">Что случилось с паролями в логах Twitter</a>"

2.Простой URL:

https://www.youtube.com/watch?v=2Cj6CbC-DkU

Класс TextView имеет два способа, которыми мы можем выделить ссылки и сделать их кликабельными:

1.через код:

TextView.setMovementMethod(LinkMovementMethod.getInstance());

2.через XML:

android:autoLink="web"

Известная проблема, что для обработки гиперссылок мы должны использовать первый метод с LinkMovementMethod и удалить атрибут xml "autoLink".

Точкав том, что когда я использую это решение, мой textView игнорирует простые ссылки (вторая строка ввода из примера).И наоборот - если я использую решение XML, textView будет игнорировать гиперссылки.

Вопрос в том, что мне следует использовать для поддержки как гиперссылок, так и простых URL-адресов?

1 Ответ

0 голосов
/ 21 мая 2018

Допустим, вы хотите добавить гиперссылку на слово Twitter, для этого можно использовать SpannableStringBuilder, например:

 SpannableStringBuilder spanTxt = new SpannableStringBuilder(
            "Что случилось с паролями в логах ");
    spanTxt.append("Twitter");
    spanTxt.setSpan(new ClickableSpan() {
        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setColor(ContextCompat.getColor(context, R.color.pick_button_color)); //Your color for hyperlinked word
            ds.setUnderlineText(false);
        }

        @Override
        public void onClick(View widget) {
           // Handle click on Twitter
        }
    }, spanTxt.length() - "Twitter".length(), spanTxt.length(), 0);
    spanTxt.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.pick_button_color)), 33, spanTxt.length(), 0);  // I put 33 check did I count correctly

    textView.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setText(spanTxt, TextView.BufferType.SPANNABLE);
...