Как создать ссылки в текстовом клиенте?

У меня есть следующий 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="#" onclick="location.href='http://www.google.com'; return false;">Google</a></string>

Но это делает:

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

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

Ответы

Ответ 1

Погруженный в демонстрации 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().

Ответ 2

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

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

Ответ 3

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

  • android:autoLink="web" работает, если у вас есть полные ссылки в вашем HTML. Следующее будет выделено синим цветом и доступно для кликов:
  • Некоторые тексты <a href="http://www.google.com">http://www.google.com</a>
  • Некоторые тексты http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); будет работать со следующим (будет выделен и доступен кликабель):
  • Некоторые тексты <a href="http://www.google.com">http://www.google.com</a>
  • Некоторые тексты http://www.google.com
  • Некоторые тексты <a href="http://www.google.com">Go to Google</a>

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

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

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

Ответ 4

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

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

и NOT:

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

В общем, закодируйте все шевроны в такой строке. BTW, ссылка должна начинаться с 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)));

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

Ответ 5

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

Linkify.addLinks(TextView, Linkify.ALL);

делает ссылки доступными нажатыми здесь

Ответ 6

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

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

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

     <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), очень вводят меня в заблуждение...

Ответ 7

Я добавил эту строку в 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:[email protected]?Subject=Lost%20Password" target="_top">[email protected]</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>

Ответ 8

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

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

Ответ 9

Я надеюсь, что это поможет вам;

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());

Ответ 10

Ричард, в следующий раз вы должны добавить этот код в 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, чтобы ссылка была нажата.

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

Ответ 11

Самое легкое, что сработало для меня, - это использовать 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-адреса в тексте в текстовом виде.

Ответ 12

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

В string.xml:

<string name="applink">Looking for the regular Zesteve App? 
<a href="https://play.google.com/store/apps/details?id=prokart.in.app">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" с использованием этого подхода.

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

Ответ 13

с помощью 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

Вот очень строгий код 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 Phone and URL (hyperlink) select and go.
Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);

Ответ 15

Я заметил, что используя 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"/>

и он работал как шарм.

Ответ 16

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

Ответ 17

Вам нужно только следующее:

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" />

Ответ 18

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

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"/>

Ответ 19

Принятый ответ правильный, НО это будет означать, что номера телефонов, карты, адреса электронной почты и регулярные ссылки, например. http://google.com Без href-тегов NO LONGER не будет доступен, поскольку вы не можете автолинкнуть в 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"; по умолчанию оно истинно.

Ответ 20

Вот как я решил использовать интерактивные и видимые ссылки в 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>"));
    }

Ответ 21

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

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));

Ответ 22

[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.
}

Ответ 23

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

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

Ответ 24

Телефон 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());

Ответ 25

Добавьте CDATA в свой текстовый ресурс

strings.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>

Ответ 26

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

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

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(in 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.

Ответ 27

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

  • Определите свою ссылку в строке, например "это мой веб-сайт". Вы можете добавить его в xml или в код.

  • В xml, который имеет TextView, добавьте следующее:


android:linksClickable="true"

android:autoLink="web"

Ответ 28

Я использую автолинк для "авто подчеркивания" текста, но просто сделал "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
        {
        }
    }

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

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

Ответ 29

Управление Связать текст Цвет Также 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 );

Ответ 30

Создайте метод расширения для 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