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

1171 голосов
/ 30 апреля 2010

Похороненный в демоверсиях API, я нашел решение моей проблемы:

Link.java:

    // text2 has links specified by putting <a> tags in the string
    // resource.  By default these links will appear but not
    // respond to user input.  To make them active, you need to
    // call setMovementMethod() on the TextView object.

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

Я удалил большинство атрибутов в TextView, чтобы они соответствовали тому, что было в демонстрационной версии.

<TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txtCredits"/>

Это решило это. Довольно трудно обнаружить и исправить.

Важно : не забудьте удалить autoLink="web", если вы звоните setMovementMethod().

501 голосов
/ 29 апреля 2010

Я использую только android:autoLink="web", и он отлично работает. Щелчок по ссылке открывает браузер и показывает правильную страницу.

Одна вещь, которую я могу догадаться, - это то, что над ссылкой находится какой-то другой вид. Нечто прозрачное заполняет весь родительский элемент, но ничего не отображает над ссылкой. В этом случае щелчок переходит к этому представлению вместо ссылки.

334 голосов
/ 18 декабря 2013

Проведя некоторое время с этим, я обнаружил, что:

  • android:autoLink="web" работает, если у вас есть полные ссылки в вашем HTML. Следующее будет выделено синим цветом и кликабельно:
  • view.setMovementMethod(LinkMovementMethod.getInstance()); будет работать со следующим (будет выделено и активировано):

Обратите внимание, что третий вариант имеет гиперссылку, но описание самой ссылки (части между тегами) не является ссылкой. android:autoLink="web" не работает НЕ с такими ссылками.

  • android:autoLink="web", если установлен в XML, переопределит view.setMovementMethod(LinkMovementMethod.getInstance()); (т.е. ссылки третьего вида будут выделены, но не будут кликаться).

Мораль этой истории заключается в использовании view.setMovementMethod(LinkMovementMethod.getInstance()); в вашем коде и убедитесь, что у вас нет android:autoLink="web" в макете XML, если вы хотите, чтобы все ссылки были кликабельными.

92 голосов
/ 12 апреля 2012

Вышеуказанные решения не сработали для меня, но сработало следующее (и, кажется, немного чище).
Во-первых, в строковом ресурсе определите шевроны открытия тега, используя кодировку сущности HTML, т.е.

&lt;a href="http://www.google.com">Google&lt;/a>

и НЕ:

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

В общем, закодируйте все шевроны в строке следующим образом. Кстати, ссылка должна начинаться с http://

Затем (как предложено здесь ) установите эту опцию в TextView:

 android:linksClickable="true"

Наконец, в коде выполните:

((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

Вот и все, никаких регулярных выражений или других ручных хаков не требуется.

61 голосов
/ 26 марта 2014

я использовал это просто

Linkify.addLinks(TextView, Linkify.ALL);

делает ссылки кликабельными, учитывая здесь

60 голосов
/ 29 июня 2012

Если вы хотите добавить HTML-подобную ссылку, все, что вам нужно сделать, это:

  • добавить HTML-подобную строку ресурса:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
  • добавьте свой вид в макет, НЕТ никакой специфичной для ссылки конфигурации:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
    
  • программно добавить соответствующий MovementMethod в TextView:

     mLink = (TextView) findViewById(R.id.link);
     if (mLink != null) {
       mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }
    

Вот и все! И да, наличие таких опций, как "autoLink" и "linksClickable", работающих только с явными ссылками (не заключенными в html-теги), также вводит меня в заблуждение ...

45 голосов
/ 25 февраля 2014

Я добавил эту строку в TextView: android:autoLink="web"
Ниже приведен пример использования в файле макета.

layout.xml образец

    <TextView
        android:id="@+id/txtLostpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="email"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/lostpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/txtDefaultpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="web"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/defaultpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:support@cleverfinger.com.au?Subject=Lost%20Password" target="_top">support@cleverfinger.com.au</a></string>

<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>
25 голосов
/ 18 июня 2013

Надеюсь, это поможет вам;

String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";
    TextView text = (TextView) findViewById(R.id.text);


    text.setText(Html.fromHtml(value));
    text.setMovementMethod(LinkMovementMethod.getInstance());
24 голосов
/ 08 мая 2012

Только то, что вам нужно, чтобы добавить это в текстовом представлении в XML

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>
19 голосов
/ 25 апреля 2013

Ричард, в следующий раз вы должны добавить этот код в TextView вместо XML макета.

android:autoLink="all"

Это должно быть так.

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

Вам не нужно использовать этот код (t2.setMovementMethod(LinkMovementMethod.getInstance());), чтобы сделать ссылку кликабельной.

Кроме того, вот истина: пока вы устанавливаете autoLink и linksClickable , не забудьте добавить это в String.xml file чтобы работала кликабельная ссылка.

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