Как сделать ссылки в TextView кликабельными? - PullRequest
924 голосов
/ 29 апреля 2010

У меня определено следующее TextView:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

где @string/txtCredits - строковый ресурс, содержащий <a href="some site">Link text</a>.

Android выделяет ссылки в TextView, но они не реагируют на нажатия. Может кто-нибудь сказать мне, что я делаю не так? Должен ли я установить onClickListener для TextView в моей деятельности для чего-то такого простого?

Похоже, это связано с тем, как я определяю свой строковый ресурс. Это не работает:

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

Но это так:

<string name="txtCredits">www.google.com</string>

Что является обломом, потому что я бы предпочел показать текстовую ссылку, чем показывать полный URL.

Ответы [ 33 ]

6 голосов
/ 19 августа 2014

Используйте код ниже:

String html = "<a href=\"http://yourdomain.com\">Your Domain Name</a>"
TextView textview = (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(LinkMovementMethod.getInstance());
textview.setText(Html.fromHtml(html));
6 голосов
/ 24 апреля 2018

[Tested in Pre-lollipop as well as in Lollipop and above]

Вы можете получить HTML-строку из бэкэнда или из файлов ресурсов. Если вы поместите свой текст в виде строки ресурса, обязательно добавьте тег CDATA:

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>

Затем в коде нужно получить строку, назначить ее в виде HTML и установить метод перемещения ссылки:

String yourText = getString(R.string.your_text);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));
} else {
   textView.setText(Html.fromHtml(yourText));
}

try {
   subtext.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
   //This code seems to crash in some Samsung devices.
   //You can handle this edge case base on your needs.
}
5 голосов
/ 30 апреля 2010

Причина, по которой у вас возникла проблема, заключается в том, что она пытается сопоставить только «голые» адреса. такие вещи, как "www.google.com" или "http://www.google.com".

Выполнение текста через Html.fromHtml () должно помочь. Вы должны делать это программно, но это работает.

4 голосов
/ 08 апреля 2013

телефон Autolink у меня не работает. Следующее сработало как талисман,

TextView tv = (TextView) findViewById(R.id.emergencynos);
String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";        
tv.append(Html.fromHtml(html2));
tv.setMovementMethod(LinkMovementMethod.getInstance());
4 голосов
/ 17 февраля 2015

Добавить CDATA к вашему строковому ресурсу

strings.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
3 голосов
/ 17 февраля 2013

Не знаю, стоит ли добавлять еще один ответ, но на всякий случай ...

Мне пришлось разыскать это в нескольких местах, но, наконец, эта версия кода заработала.

strings.xml:

<string name="name1">&lt;a href="http://www.google.com">link text1&lt;/a></string>
<string name="name2">&lt;a href="http://www.google.com">link text2&lt;/a></string>

myactivity.xml:

<TextView 
    android:id="@+id/textview1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

<TextView 
    android:id="@+id/textview2"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

myactivty.java (в onCreate ()):

TextView tv1 = (TextView)findViewById(R.id.textview1);
TextView tv2 = (TextView)findViewById(R.id.textview2);

tv1.setText(Html.fromHtml(getResources().getString(R.string.name1)));
tv2.setText(Html.fromHtml(getResources().getString(R.string.name2)));
tv1.setMovementMethod(LinkMovementMethod.getInstance());
tv2.setMovementMethod(LinkMovementMethod.getInstance());

Это создаст две интерактивные гиперссылки с текстом link text1 и link text2, которые перенаправят пользователя в Google.

3 голосов
/ 12 апреля 2013

Если вы используете TextView на основе XML, для ваших требований вам нужно сделать всего две вещи:

  1. Определить вашу ссылку в строке, например, «это моя веб-страница».Вы можете добавить его в XML или в код.

  2. В XML, который имеет TextView, добавьте:


android:linksClickable="true"

android:autoLink="web"
3 голосов
/ 10 июля 2015

Я использую автолинк для «автоматического подчеркивания» текста, но только что сделал «onClick», который управляет им. (Я сам столкнулся с этой проблемой)

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:textSize="18dp"
            android:autoLink="all"
            android:text="@string/twitter"
            android:onClick="twitter"/>

public void twitter (View view)
    {
        try
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech"));
            startActivity(browserIntent);

        }
        finally
        {
        }
    }

Не требует никаких разрешений, поскольку вы передаете намерение приложениям, которые управляют этими ресурсами (например, браузер).

Это было то, что работало для меня. Удачи.

2 голосов
/ 30 июня 2018

Управление Linkify text Color Также enter image description here

tv_customer_care_no.setLinkTextColor(getResources().getColor(R.color.blue));
  tv_customer_care_no.setText("For us to reach out to you, please fill the details below or contact our customer care at  18004190899 or visit our website http://www.dupont.co.in/corporate-links/contact-dupont.html ");
   Linkify.addLinks(tv_customer_care_no, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
   Linkify.addLinks(tv_customer_care_no, Linkify.ALL );
1 голос
/ 12 апреля 2019

Создание метода расширения для SpannableString:

private fun SpannableString.setLinkSpan(text: String, url: String) {
    val textIndex = this.indexOf(text)
    setSpan(
        object : ClickableSpan() {
            override fun onClick(widget: View) {
                Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) }.also { startActivity(it) }
            }
        },
        textIndex,
        textIndex + text.length,
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    )
}

Используйте его, чтобы сделать строку в вашем TextView кликабельной:

    myTextView.apply {
        movementMethod = LinkMovementMethod.getInstance()

        val googleUrl = "http://www.google.com"
        val microsoftUrl = "http://www.microsoft.com"

        val google = "Google"
        val microsoft = "Microsoft"

        val message = SpannableString("$google & $microsoft").apply {
            setLinkSpan(google, googleUrl)
            setLinkSpan(microsoft, microsoftUrl)
        }

        text = message
    }

Наслаждайтесь!

enter image description here

...