Как сделать ссылки в TextView кликабельными?
у меня есть следующее 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="http://www.google.com">Google</a></string>
а это:
<string name="txtCredits">www.google.com</string>
это облом, потому что я бы предпочел показать текстовую ссылку, чем показать полный URL.
30 ответов:
похороненный в демонстрациях API, я нашел решение своей проблемы:
ссылка.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().
Я использую только
android:autoLink="web"и он отлично работает. Щелчок по ссылке открывает браузер и показывает правильную страницу.одна вещь, я мог бы догадаться, что какой-то другой вид находится выше ссылки. Что-то прозрачное заполняет весь родитель, но не отображает ничего выше ссылки. В этом случае щелчок переходит к этому представлению вместо ссылки.
проведя некоторое время с этим, я обнаружил, что:
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-макете, если вы хотите все ссылки должны быть кликабельны.
вышеуказанные решения не работали для меня, но следующие сделали (и это кажется немного чище).
Во-первых, в строковом ресурсе определите свои шевроны открытия тега, используя кодировку сущности HTML, т. е.:<a href="http://www.google.com">Google</a>и
<a href="http://www.google.com">Google</a>В общем, закодировать все шевроны в строке, как это. Кстати, ссылка должна начинаться с
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)));вот и все, никаких регулярных выражений или других ручных хаков не требуется.
Если вы хотите добавить HTML-подобную ссылку, Все, что вам нужно сделать, это:
добавить HTML-строку ресурса:
<string name="link"><a href="https://www.google.pl/">Google</a></string>добавьте свой вид в макет без привязки конкретной конфигурации на всех:
<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-теги) очень вводят меня в заблуждение...
я использовал это просто
Linkify.addLinks(TextView, Linkify.ALL);делает ссылки кликабельными, учитывая здесь
я добавил эту строку с
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>
Я надеюсь, что это поможет вам;
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());
только то, что вам нужно добавить это в текстовом представлении в xml
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:autoLink="web"/>
Ричард, в следующий раз, вы должны добавить этот код под 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());) для того, чтобы сделать кликабельную ссылку.кроме того, вот правда: пока вы выберите автоссылка и linksClickable, не забудьте добавить это строку.xml файл так, что кликабельная ссылка будет работа.
<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
С помощью linkify: Linkify возьмите кусок текста и регулярное выражение и превратите все совпадения регулярных выражений в тексте в кликабельные ссылки
TextView textView = (TextView) findViewById(R.id.textView); textView.setText("http://www.domain.com"); Linkify.addLinks(textView, Linkify.WEB_URLS);Не забудьте
import android.widget.TextView;
самое простое, что сработало для меня, это использовать 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);и он будет автоматически обнаруживать веб-адреса из текста в textview.
Я заметил, что с помощью
<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"/>и он работал как шарм.
вот очень одна строка 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's Phone and URL (hyperlink) select and go. Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
обязательно не использовать
setAutoLinkMask(Linkify.ALL)при использованииsetMovementMethod(LinkMovementMethod.getInstance())иHtml.fromHTML()при правильном форматированииHTMLссылки (например,<a href="http://www.google.com/">Google</a>).
следующее должно работать для тех, кто ищет сочетание текста и гиперссылки внутри приложения Android.
на
string.xml:<string name="applink">Looking for the regular Zesteve App? <a href="https://play.google.com/store/apps/details?id=zesteve.com.myapplication">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"используя этот подход.Я надеюсь, вы найдете это полезным.
использовать это...
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"/>
вам нужно только это:
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" />
принятый ответ правильный, но это будет означать, что телефонные номера, карты, адреса электронной почты и регулярные ссылки например
http://google.comбез тегов href больше не будет кликабельным, так как вы не можете иметь автолинк в 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", и это правда по умолчанию.
вот как я решил кликабельные и видимые ссылки в 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>")); }
использовать ниже код:
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));
причина, по которой у вас возникла проблема, заключается в том, что он только пытается соответствовать "голым" адресам. такие вещи, как "www.google.com" или "http://www.google.com".
запуск вашего текста через Html.fromHtml() следует сделать трюк. Вы должны сделать это программно, но это работает.
Автолинк телефон не работал для меня. Следующее сработало как шарм,
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());
добавить CDATA в строку ресурса
строки.xml
<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
не знаю, стоит ли добавлять еще один ответ, но на всякий случай...
Я должен был выследить это в нескольких местах, но, наконец, получил эту версию кода для работы.
строки.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 (в 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.
при использовании XML на основе TextView, для вашего требования вам нужно сделать только две вещи:
определите свою ссылку в строке, например "это моя Веб-страница." Вы можете добавить его в XML или в коде.
в xml, который имеет TextView, добавьте эти:
android:linksClickable="true" android:autoLink="web"
Я использую автолинк для "автоматического подчеркивания" текста, но просто сделал "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 { } }не требует никаких разрешений, поскольку вы передаете намерение приложениям, которые управляют этими ресурсами (т. е. браузер).
Это было то, что работал для меня. Удача.
[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. }
просто потратил столько времени, чтобы выяснить, что вы должны использовать getText (R. string.что угодно) вместо getString (R. string.все.)..
в любом случае, вот как я получил свой рабочий. С несколькими гиперссылками в том же текстовом представлении тоже.
TextView termsTextView = (TextView) getActivity().findViewById(R.id.termsTextView); termsTextView.append("By registering your account, you agree to our "); termsTextView.append(getText(R.string.terms_of_service)); termsTextView.append(", "); termsTextView.append(getText(R.string.fees)); termsTextView.append(", and the "); termsTextView.append(getText(R.string.stripe_connected_account_agreement)); termsTextView.setMovementMethod(LinkMovementMethod.getInstance()); <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/termsTextView"/>пример строки
<string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>
мой код был такой:
<TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/link" android:text="@string/forgot" android:layout_marginTop="16dp" android:gravity="center" android:linksClickable="true"/>мой Java-код был такой:
/*TextView action*/ TextView textView = (TextView) findViewById(R.id.link); textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(LoginActivity.this,forgot.class)); } });Это просто указывает на ссылку на другую деятельность. Но эта ссылка кликабельна и работает ровно. Протестировано в Android Studio 1.5 (предварительный просмотр)
Comments