Android: текстовая гиперссылка - PullRequest
48 голосов
/ 24 марта 2012

Я знаю, что если вы поместите ссылку в текстовое представление, она будет работать, но если я хочу, например, отобразить:

google stackoverflow

, а не всю ссылку (только тег)Как сделать эти ссылки кликабельными?

Ответы [ 9 ]

60 голосов
/ 24 марта 2012

У вас может быть два отдельных TextView и вы можете выровнять их соответствующим образом в макете, если это необходимо:

    Text1.setText(
        Html.fromHtml(
            "<a href=\"http://www.google.com\">google</a> "));
    Text1.setMovementMethod(LinkMovementMethod.getInstance());

    Text2.setText(
            Html.fromHtml(
                "<a href=\"http://www.stackoverflow.com\">stackoverflow</a> "));
    Text2.setMovementMethod(LinkMovementMethod.getInstance());

Тогда, если вы хотите удалить "подчеркивание ссылки".Создайте класс:

public class URLSpanNoUnderline extends URLSpan {
    public URLSpanNoUnderline(String url) {
        super(url);
    }
    @Override public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setUnderlineText(false);
        }
}

Затем добавьте этот метод в ваш основной класс Activity, где у вас есть TextViews

private void stripUnderlines(TextView textView) {
    Spannable s = new SpannableString(textView.getText());
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
    for (URLSpan span: spans) {
        int start = s.getSpanStart(span);
        int end = s.getSpanEnd(span);
        s.removeSpan(span);
        span = new URLSpanNoUnderline(span.getURL());
        s.setSpan(span, start, end, 0);
    }
    textView.setText(s);
}

И затем просто вызовите его после инициализации TextViews (в вашем onCreate):

stripUnderlines(Text1);
stripUnderlines(Text2);
51 голосов
/ 16 июля 2012
TextView t2 = (TextView) findViewById(R.id.textviewidname);
t2.setMovementMethod(LinkMovementMethod.getInstance());

и

<string name="google_stackoverflow"><a href="/6341770/android-tekstovaya-giperssylka">google stack overflow</a></string>

Ссылка: " Android: текстовая гиперссылка "

и тег "переполнение стека Google"

Определите первый блок кода в вашем Java и второй блок кода в вашем файле strings.xml. Кроме того, не забудьте ссылаться на идентификатор textView из вашего макета страницы в Java.

15 голосов
/ 03 октября 2015

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

13 голосов
/ 24 марта 2012

Очень простой способ сделать это ---

В вашей деятельности -

 TextView tv = (TextView) findViewById(R.id.site);
 tv.setText(Html.fromHtml("<a href=http://www.stackoverflow.com> STACK OVERFLOW "));
 tv.setMovementMethod(LinkMovementMethod.getInstance());

Тогда вы получите только тег, а не всю ссылку.

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

6 голосов
/ 24 марта 2012

это должно работать.

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

and

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="@string/txtCredits"
android:id="@+id/text2"
 android:layout_centerInParent="true"
android:layout_marginTop="20dp"></TextView>
2 голосов
/ 22 сентября 2014

Я столкнулся с той же проблемой и наконец нашел рабочее решение.

  1. в файле string.xml определите:

    <string name="textWithHtml">The URL link is &lt;a href="http://www.google.com">Google&lt;/a></string>
    

Заменить знак "<" на символ меньше экранированного HTML. </p>

В коде Java:

String text = v.getContext().getString(R.string.textWithHtml);
textView.setText(Html.fromHtml(text));
textView.setMovementMethod(LinkMovementMethod.getInstance());

И текстовое поле будет корректно отображать текст с активной ссылкой

2 голосов
/ 14 июля 2014

Это моя рабочая реализация

private void showMessage()
    {

        lblMessage.setText("");

        List<String> messages = db.getAllGCMMessages();

        for (int k = messages.size() - 1; k >= 0; --k)
         {

            String message  =  messages.get(k).toString();
            lblMessage.append(message + "\n\n");

         }
     Linkify.addLinks(lblMessage, Linkify.ALL);
  }

и чтобы изменить цвет гиперссылок, я отредактировал свой xml для textview -

 android:textColorLink="#69463d"
1 голос
/ 14 января 2019

А как насчет привязки данных?

@JvmStatic
@BindingAdapter("textHtml")
fun setHtml(textView: TextView, resource: String) {
    val html: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(resource, Html.FROM_HTML_MODE_COMPACT)
    } else {
        Html.fromHtml(resource)
    }

    textView.movementMethod = LinkMovementMethod.getInstance()
    textView.text = html
}

strings.xml

<string name="text_with_link">&lt;a href=%2$s>%1$s&lt;/a> </string>

в вашем layout.xml

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:textHtml="@{@string/text_with_link(model.title, model.url)}"
            tools:text="Some text" />

Где заголовок и ссылка в xml - это простая строка

Также вы можете передать несколько аргументов адаптеру привязки данных

@JvmStatic
@BindingAdapter(value = ["textLink", "link"], requireAll = true)
fun setHtml(textView: TextView, textLink: String?, link: String?) {
    val resource = String.format(textView.context.getString(R.string.text_with_link, textLink, link))

    val html: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(resource, Html.FROM_HTML_MODE_COMPACT)
    } else {
        Html.fromHtml(resource)
    }

    textView.movementMethod = LinkMovementMethod.getInstance()
    textView.text = html
}

и в .xml передать аргументы отдельно

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:link="@{model.url}"
            app:textLink="@{model.title}"
            tools:text="Some text" />
0 голосов
/ 14 апреля 2019

Использование

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:autoLink="web"
    android:text="www.google.com" />

Этот флаг

AutoLink = "паутина"

определяет, будут ли такие ссылки, как URL-адреса, автоматически обнаруживаться и преобразовываться в интерактивные ссылки. Значением по умолчанию является «none», отключение этой функции. Значения: все, электронная почта, карта, нет, телефон, Интернет.

...