Как сделать ссылки в 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 ]

19 голосов
/ 29 июля 2016

Самое простое, что сработало для меня, это использовать Linkify

TextView txt_Message = (TextView) view.findViewById(R.id.txt_message);
txt_Message.setText("This is link https://www.google.co.in/");
Linkify.addLinks(txt_Message, Linkify.WEB_URLS);

и он автоматически обнаружит веб-URL из текста в текстовом представлении.

15 голосов
/ 07 февраля 2015

с помощью linkify : Linkify берет фрагмент текста и регулярное выражение и превращает все совпадения регулярных выражений в тексте в интерактивные ссылки

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://www.domain.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);

Не забудьте

import android.widget.TextView;
14 голосов
/ 28 мая 2016

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

TextView textView = (TextView)findViewById(R.id.textView1);
textView.setText("some url is www.google.com phone 7504567890 another url lkgndflg.com ");

// Makes the textView's Phone and URL (hyperlink) select and go.
Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
14 голосов
/ 28 июля 2017

Следующее должно работать для всех, кто ищет комбинацию текста и гиперссылки в приложении Android.

В string.xml:

<string name="applink">Looking for the regular Zesteve App? 
<a href="https://play.google.com/store/apps/details?id=zesteve.com.myapplication">Get it here</a>
</string>

Теперь вы можете использовать это string в любом заданном View, например:

<TextView
    android:id="@+id/getapp"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:textColor="@color/main_color_grey_600"
    android:textSize="15sp"
    android:text="@string/applink"/>

Теперь в своей Деятельности или Фрагменте сделайте следующее:

TextView getapp =(TextView) findViewById(R.id.getapp);
getapp.setMovementMethod(LinkMovementMethod.getInstance());

На данный момент вам не требуется устанавливать android:autoLink="web" или android:linksClickable="true", используя этот подход.

Надеюсь, вы найдете это полезным.

12 голосов
/ 14 ноября 2012

Я заметил, что используя android:autoLink="web", таким образом

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:autoLink="web"/>

работал нормально для URL-адресов, но так как у меня был адрес электронной почты и номер телефона, на который я тоже хотел связать, я в итоге использовал эту строку android:autoLink="all" вот так

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:autoLink="all"/>

и это сработало как шарм.

11 голосов
/ 22 марта 2012

Обязательно не используйте setAutoLinkMask(Linkify.ALL) при использовании setMovementMethod(LinkMovementMethod.getInstance()) и Html.fromHTML() на правильно отформатированных HTML ссылках (например, <a href="http://www.google.com/">Google</a>).

9 голосов
/ 26 марта 2013

Вам нужно только это:

android:autoLink="web"

Вставьте эту строку в TextView, по которой можно кликнуть при ссылке на Интернет. URL-адрес, заданный как текст этого TextView.

Пример:

 <TextView
    android:id="@+id/textViewWikiURL"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textStyle="bold"
    android:text="http://www.wikipedia.org/"
    android:autoLink="web" />
8 голосов
/ 01 декабря 2015

Принятый ответ правильный, НО это будет означать, что номера телефонов, карты, адреса электронной почты и обычные ссылки, например, http://google.com без тегов href НИКОГДА больше не будет кликабельным, так как вы не можете иметь автолинк в XML.

Единственное законченное решение, на котором я ВСЕ кликабельно нашел, это следующее:

Spanned text = Html.fromHtml(myString);
URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);
SpannableString buffer = new SpannableString(text);
Linkify.addLinks(buffer, Linkify.ALL);
for (URLSpan span : currentSpans) {
    int end = text.getSpanEnd(span);
    int start = text.getSpanStart(span);
    buffer.setSpan(span, start, end, 0);
}
textView.setText(buffer);
textView.setMovementMethod(LinkMovementMethod.getInstance());

И TextView НЕ должен иметь android:autolink. Нет необходимости в android:linksClickable="true"; по умолчанию это правда.

8 голосов
/ 22 ноября 2012

Используйте это ...

TextView.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Intent in=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.twitter.com/"));
                        startActivity(in);
                    }

                });

и добавить разрешение в файле манифеста

<uses-permission android:name="android.permission.INTERNET"/>
7 голосов
/ 24 января 2012

Так я решил кликабельные и видимые ссылки в TextView (по коду)

private void setAsLink(TextView view, String url){
        Pattern pattern = Pattern.compile(url);
        Linkify.addLinks(view, pattern, "http://");
        view.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+url+"</a>"));
    }
...