Как создать ссылки в текстовом клиенте?
У меня есть следующий 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, то есть:
<a href="http://www.google.com">Google</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"><a href="http://www.google.com">link text1</a></string>
<string name="name2"><a href="http://www.google.com">link text2</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
Управление Связать текст Цвет Также
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
}
Наслаждайтесь!