Android: текстовая гиперссылка
Я знаю, что если вы поместите ссылку в текстовое представление, она будет работать, но если я хочу отобразить, например:
Google Stackru
а не вся ссылка (только тег) Как сделать эти ссылки кликабельными?
7 ответов
У вас может быть два отдельных 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.stackru.com\">stackru</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);
TextView t2 = (TextView) findViewById(R.id.textviewidname);
t2.setMovementMethod(LinkMovementMethod.getInstance());
а также
<string name="google_stackru"><a href="https://stackru.com/questions/9852184/android-textview-hyperlink?rq=1">google stack overflow</a></string>
Ссылка " Android: текстовая гиперссылка"
и тег "переполнение стека Google"
Определите первый блок кода в Java и второй блок кода в файле strings.xml. Кроме того, не забудьте ссылаться на идентификатор textView из вашего макета страницы в Java.
android:autoLink="web"
просто работает, если у вас есть полные ссылки в вашем HTML. Следующее будет выделено синим цветом и кликабельно:
Очень простой способ сделать это ---
В вашей деятельности--
TextView tv = (TextView) findViewById(R.id.site);
tv.setText(Html.fromHtml("<a href=http://www.stackru.com> STACK OVERFLOW "));
tv.setMovementMethod(LinkMovementMethod.getInstance());
Тогда вы получите только тег, а не всю ссылку..
Надеюсь, это поможет вам...
Это должно работать.
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>
Как насчет привязки данных?
@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"><a href=%2$s>%1$s</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" />
Это моя рабочая реализация
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"
Использование
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:text="www.google.com" />
Этот флаг
AutoLink="паутина"
контролирует, будут ли ссылки, такие как URL, автоматически найдены и преобразованы в интерактивные ссылки. Значением по умолчанию является "none", отключение этой функции. Значения: все, электронная почта, карта, нет, телефон, Интернет.
Я столкнулся с той же проблемой и, наконец, нашел рабочее решение.
в файле string.xml определите:
<string name="textWithHtml">The URL link is <a href="http://www.google.com">Google</a></string>
Замените "<" меньше символа на экранированный HTML-символ.
В коде Java:
String text = v.getContext().getString(R.string.textWithHtml); textView.setText(Html.fromHtml(text)); textView.setMovementMethod(LinkMovementMethod.getInstance());
И TextBox будет правильно отображать текст с активной ссылкой