Сделать текстовое представление гиперссылки в android


80

Я хочу сделать ссылку для текста текстового просмотра, например Google . Есть ли способ сделать такую ​​ссылку. (т.е.) При нажатии на слово Google должно открываться соответствующее сообщение. Любые идеи приветствуются.




1
просто используйте Linkify.addLinks (TextView, Linkify.ALL);
AndroidGeek

Ответы:


135

Попробуйте это и дайте мне знать, что происходит ...

Используя код Java:

TextView textView =(TextView)findViewById(R.id.textView);
textView.setClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href='http://www.google.com'> Google </a>";
textView.setText(Html.fromHtml(text));

Начиная с уровня API> = 24 и далее Html.fromHtml(String source)не рекомендуется использовать fromHtml(String, int),

textView.setText(Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT));

Или в XML-файле макета внутри атрибутов виджета TextView

android:autoLink="web"
android:linksClickable="true"

я получил ожидаемый результат. Спасибо за твой ответ
Шринивас

1
Если текст гиперссылки присутствует в strings.xml, то ни один из предложенных ответов не работает. Это работает очень странно. Если я устанавливаю текст непосредственно в макете xml, он работает, но когда я устанавливаю данные textview в java-коде, он не работает.
Велю

2
Просто упомяну, что если вы используете код Java, вам нужно удалить его android:autoLink="web"из XML. У меня были оба, и это не сработало.
ntonis Papadakis

53

используйте android:autoLink="web"в своем TextView xml. Он должен автоматически преобразовывать URL-адреса, доступные при нажатии (если они находятся в тексте)


14
Также включите android: linksClickable = "true"
Аджит Мемана

@waqaslam в данном случае, где мы помещаем ссылку.
Garg,

1
@ Garg's Это текст, который вы установили в textview, который может содержать гиперссылки
waqaslam

28

Все протестировано и работает 100%
Решение: android:autoLink="web"
ниже приведен полный пример 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/txtLostpassword"
        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>

3
Это не сработает, если я изменю эту строку> cleverfinger.com.au/user-guide/ </a> </ string > на другой текст, например: Щелкните здесь
Musculaa

2
это работает, только если текст содержит полный URL-адрес, например: www.something.com
Рахул Тивари,


5

Примечание. - Html.fromHtml устарел в Android N.

Вам нужно сделать проверку и поддержку Android Nи более высокие версии Android

                  //Set clickable true
                 tagHeading.setClickable(true);
                 
                  //Handlle click event
                  tagHeading.setMovementMethod(LinkMovementMethod.getInstance());

                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                    tagHeading.setText(Html.fromHtml("<a href='https://github.com/hiteshsahu'>https://github.com/hiteshsahu</a>", Html.FROM_HTML_MODE_LEGACY));
                } else {
                    tagHeading.setText(Html.fromHtml("<a href='https://github.com/hiteshsahu'>https://github.com/hiteshsahu</a>"));
                }
 

Альтернативно

Вы можете не захотеть программно добавлять флаг autoLink в TextView.

android: autoLink = "Интернет"

android: linksClickable = "true"

Таким образом, вам не нужно добавлять <a href='somelink'>теги.

Что является недостатком, если вы хотите добавить hyperlinkна textвы не можете сделать это таким образом. например, вы не можете сделать что-то вроде этого: - [ hiteshsahu ] [1]

           <TextView
                android:id="@+id/tag_info"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/tag_ll"
                android:layout_gravity="left"
                android:layout_margin="10dp"
                android:autoLink="web"
                android:linksClickable="true"
                android:text="https://github.com/hiteshsahu"
                android:textColor="@color/secondary_text" />

Результат обоих подходов: -

https://github.com/hiteshsahu


1

Последняя версия SDK fromHtmlустарела. Используйте строку ниже

String yourtext = "<a style='text-decoration:underline' href='http://www.sample.com'> Sample Website </a>";
    if (Build.VERSION.SDK_INT >= 24) {
        textView.setText(Html.fromHtml(yourtext, Html.FROM_HTML_MODE_LEGACY));
    } else {
        textView.setText(Html.fromHtml(yourtext));
    }

0

Я сделал следующую функцию расширения текстового представления.

@SuppressLint("SetTextI18n")
fun TextView.makeHyperLink(url: String) {
    text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml("<a href='${url}'>${text}</a>", Html.FROM_HTML_MODE_COMPACT)
    } else {
        Html.fromHtml("<a href='${url}'>${text}</a>")
    }
    movementMethod = LinkMovementMethod.getInstance()
    isClickable = true
}

и называя это так

tvTos.makeHyperLink(tos_url)

Вы также можете передать текст в качестве параметра.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.