To, co staram się osiągnąć, to mieć klikalne hiperłącza w tekście wiadomości wyświetlanym przez AlertDialog
. Podczas gdy AlertDialog
implementacja szczęśliwie podkreśla i koloruje wszelkie hiperłącza (zdefiniowane przy użyciu <a href="...">
przekazanego zasobu ciągu Builder.setMessage
) dostarczone, linki nie stają się klikalne.
Kod, którego obecnie używam, wygląda następująco:
new AlertDialog.Builder(MainActivity.this).setTitle(
R.string.Title_About).setMessage(
getResources().getText(R.string.about))
.setPositiveButton(android.R.string.ok, null)
.setIcon(R.drawable.icon).show();
Chciałbym uniknąć używania a WebView
do wyświetlania tylko fragmentu tekstu.
android
user-interface
hyperlink
custom-controls
Thilo-Alexander Ginkel
źródło
źródło
Odpowiedzi:
Jeśli w oknie dialogowym pokazujesz tylko tekst i adresy URL, być może rozwiązanie jest prostsze
public static class MyOtherAlertDialog { public static AlertDialog create(Context context) { final TextView message = new TextView(context); // i.e.: R.string.dialog_message => // "Test this dialog following the link to dtmilano.blogspot.com" final SpannableString s = new SpannableString(context.getText(R.string.dialog_message)); Linkify.addLinks(s, Linkify.WEB_URLS); message.setText(s); message.setMovementMethod(LinkMovementMethod.getInstance()); return new AlertDialog.Builder(context) .setTitle(R.string.dialog_title) .setCancelable(true) .setIcon(android.R.drawable.ic_dialog_info) .setPositiveButton(R.string.dialog_action_dismiss, null) .setView(message) .create(); } }
Jak pokazano tutaj http://picasaweb.google.com/lh/photo/up29wTQeK_zuz-LLvre9wQ?feat=directlink
źródło
Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Nie podobała mi się najpopularniejsza obecnie odpowiedź, ponieważ znacząco zmienia formatowanie wiadomości w oknie dialogowym.
Oto rozwiązanie, które umożliwi linkify tekstowi w oknie dialogowym bez zmiany stylu tekstu:
// Linkify the message final SpannableString s = new SpannableString(msg); // msg should have url to enable clicking Linkify.addLinks(s, Linkify.ALL); final AlertDialog d = new AlertDialog.Builder(activity) .setPositiveButton(android.R.string.ok, null) .setIcon(R.drawable.icon) .setMessage( s ) .create(); d.show(); // Make the textview clickable. Must be called after show() ((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
źródło
onCreateDialog
tematyceDialogFragment
. Wystarczyło ustawić klikalny kod naonStart
podany,show
który został wywołany, aby wywołać DialogFragmentsetMessage(R.string.something)
, nie musisz jawnie używać linfy. Nie jest również konieczne, abycreate()
obiekt AlertDialog przed wywołaniemshow()
(można go wywołać w programie Builder), a ponieważshow()
zwraca obiekt okna dialogowego,findViewById(android.R.id.message)
można go połączyć. Zawiń to wszystko w try-catch na wypadek, gdyby widok wiadomości nie był TextView i masz zwięzłe sformułowanie.To powinno sprawić, że
<a href>
tagi również zostaną podświetlone. Zwróć uwagę, że właśnie dodałem kilka wierszy do kodu emmby. więc chwała mufinal AlertDialog d = new AlertDialog.Builder(this) .setPositiveButton(android.R.string.ok, null) .setIcon(R.drawable.icon) .setMessage(Html.fromHtml("<a href=\"http://www.google.com\">Check this link out</a>")) .create(); d.show(); // Make the textview clickable. Must be called after show() ((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
źródło
setMessage(R.string.cool_link)
współpracuje z<string name="cool_link"><a href="http://www.google.com">Check this link out</a></string>
Html.fromHtml("string with links", Html.FROM_HTML_MODE_LEGACY)
setMovementMethod()
to ważna część, w przeciwnym razie adres URL nie będzie klikalny.Właściwie, jeśli chcesz po prostu użyć ciągu znaków bez zajmowania się wszystkimi widokami, najszybszym sposobem jest znalezienie widoku tekstu wiadomości i linkify to:
d.setMessage("Insert your cool string with links and stuff here"); Linkify.addLinks((TextView) d.findViewById(android.R.id.message), Linkify.ALL);
źródło
JFTR, oto rozwiązanie, które po pewnym czasie wymyśliłem:
View view = View.inflate(MainActivity.this, R.layout.about, null); TextView textView = (TextView) view.findViewById(R.id.message); textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setText(R.string.Text_About); new AlertDialog.Builder(MainActivity.this).setTitle( R.string.Title_About).setView(view) .setPositiveButton(android.R.string.ok, null) .setIcon(R.drawable.icon).show();
Odpowiedni plik about.xml zapożyczony jako fragment ze źródeł Androida wygląda następująco:
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scrollView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingTop="2dip" android:paddingBottom="12dip" android:paddingLeft="14dip" android:paddingRight="10dip"> <TextView android:id="@+id/message" style="?android:attr/textAppearanceMedium" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dip" android:linksClickable="true" /> </ScrollView>
Ważnymi częściami są ustawienie linksClickable na true i setMovementMethod (LinkMovementMethod.getInstance ()).
źródło
setLinksClickable(true)
(myślę, że już było), alesetMovementMethod(...)
zrobiło różnicę.Zamiast ...
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); dialogBuilder.setTitle(R.string.my_title); dialogBuilder.setMessage(R.string.my_text);
... teraz używam:
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); dialogBuilder.setTitle(R.string.my_title); TextView textView = new TextView(this); textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setText(R.string.my_text); dialogBuilder.setView(textView);
źródło
Najprostszy sposób:
final AlertDialog dlg = new AlertDialog.Builder(this) .setTitle(R.string.title) .setMessage(R.string.message) .setNeutralButton(R.string.close_button, null) .create(); dlg.show(); // Important! android.R.id.message will be available ONLY AFTER show() ((TextView)dlg.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
źródło
Cała powyższa odpowiedź nie usunie tagu html, itp. Jeśli podany ciąg zawiera, próbowałem usunąć wszystkie tagi i to działa dobrze dla mnie
AlertDialog.Builder builder = new AlertDialog.Builder(ctx); builder.setTitle("Title"); LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.custom_dialog, null); TextView text = (TextView) layout.findViewById(R.id.text); text.setMovementMethod(LinkMovementMethod.getInstance()); text.setText(Html.fromHtml("<b>Hello World</b> This is a test of the URL <a href=http://www.example.com> Example</a><p><b>This text is bold</b></p><p><em>This text is emphasized</em></p><p><code>This is computer output</code></p><p>This is<sub> subscript</sub> and <sup>superscript</sup></p>";)); builder.setView(layout); AlertDialog alert = builder.show();
a okno dialogowe custom_dialog wyglądałoby tak;
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_root" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="fill_parent" android:textColor="#FFF" /> </LinearLayout>
Powyższy kod usunie wszystkie tagi html i pokaże przykład jako klikalny adres URL wszystkich pozostałych w określonym tekście formatowania html.
źródło
Nie byłem zadowolony z aktualnych odpowiedzi. Są dwie rzeczy, które są ważne, gdy chcesz, aby klikalne hiperłącza w stylu href za pomocą AlertDialog:
setMessage(…)
jako, ponieważ tylko Widoki pozwalają na klikalną zawartość HTMLsetMovementMethod(…)
)Oto działający minimalny przykład:
strings.xml
<string name="dialogContent"> Cool Links:\n <a href="http://stackoverflow.com">Stackoverflow</a>\n <a href="http://android.stackexchange.com">Android Enthusiasts</a>\n </string>
MyActivity.java
… public void showCoolLinks(View view) { final TextView textView = new TextView(this); textView.setText(R.string.dialogContent); textView.setMovementMethod(LinkMovementMethod.getInstance()); // this is important to make the links clickable final AlertDialog alertDialog = new AlertDialog.Builder(this) .setPositiveButton("OK", null) .setView(textView) .create(); alertDialog.show() } …
źródło
textView.setPadding()
Sprawdziłem wiele pytań i odpowiedzi, ale to nie działa. Sam to zrobiłem. To jest fragment kodu w witrynie MainActivity.java.
private void skipToSplashActivity() { final TextView textView = new TextView(this); final SpannableString str = new SpannableString(this.getText(R.string.dialog_message)); textView.setText(str); textView.setMovementMethod(LinkMovementMethod.getInstance()); .... }
Umieść ten tag w res \ values \ String.xml
<string name="dialog_message"><a href="http://www.nhk.or.jp/privacy/english/">NHK Policy on Protection of Personal Information</a></string>
źródło
Połączyłem niektóre z omówionych powyżej opcji, aby stworzyć tę funkcję, która działa dla mnie. przekazać wynik do metody SetView () programu budującego dialog.
public ScrollView LinkifyText(String message) { ScrollView svMessage = new ScrollView(this); TextView tvMessage = new TextView(this); SpannableString spanText = new SpannableString(message); Linkify.addLinks(spanText, Linkify.ALL); tvMessage.setText(spanText); tvMessage.setMovementMethod(LinkMovementMethod.getInstance()); svMessage.setPadding(14, 2, 10, 12); svMessage.addView(tvMessage); return svMessage; }
źródło
Jeśli używasz
DialogFragment
, to rozwiązanie powinno pomóc.public class MyDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // dialog_text contains "This is a http://test.org/" String msg = getResources().getString(R.string.dialog_text); SpannableString spanMsg = new SpannableString(msg); Linkify.addLinks(spanMsg, Linkify.ALL); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.dialog_title) .setMessage(spanMsg) .setPositiveButton(R.string.ok, null); return builder.create(); } @Override public void onStart() { super.onStart(); // Make the dialog's TextView clickable ((TextView)this.getDialog().findViewById(android.R.id.message)) .setMovementMethod(LinkMovementMethod.getInstance()); } }
źródło
Dla mnie najlepszym rozwiązaniem do tworzenia okna dialogowego polityki prywatności jest:
private void showPrivacyDialog() { if (!PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(PRIVACY_DIALOG_SHOWN, false)) { String privacy_pol = "<a href='https://sites.google.com/view/aiqprivacypolicy/home'> Privacy Policy </a>"; String toc = "<a href='https://sites.google.com/view/aiqprivacypolicy/home'> T&C </a>"; AlertDialog dialog = new AlertDialog.Builder(this) .setMessage(Html.fromHtml("By using this application, you agree to " + privacy_pol + " and " + toc + " of this application.")) .setPositiveButton("ACCEPT", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putBoolean(PRIVACY_DIALOG_SHOWN, true).apply(); } }) .setNegativeButton("DECLINE", null) .setCancelable(false) .create(); dialog.show(); TextView textView = dialog.findViewById(android.R.id.message); textView.setLinksClickable(true); textView.setClickable(true); textView.setMovementMethod(LinkMovementMethod.getInstance()); } }
sprawdź działający przykład: link do aplikacji
źródło
Robię to, określając pole alertu w zasobie XML i ładując to. Zobacz na przykład about.xml (zobacz identyfikator ABOUT_URL), którego instancja jest tworzona pod koniec ChandlerQE.java . Odpowiednie części z kodu java:
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = (View) inflater.inflate(R.layout.about, null); new AlertDialog.Builder(ChandlerQE.this) .setTitle(R.string.about) .setView(view)
źródło
To jest moje rozwiązanie. Tworzy zwykły link bez znaczników HTML i bez widocznego adresu URL. Utrzymuje również projekt w nienaruszonym stanie.
SpannableString s = new SpannableString("This is my link."); s.setSpan(new URLSpan("http://www.google.com"), 11, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); AlertDialog.Builder builder; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Dialog_Alert); } else { builder = new AlertDialog.Builder(this); } final AlertDialog d = builder .setPositiveButton("CLOSE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Do nothing, just close } }) .setNegativeButton("SHARE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Share the app share("Subject", "Text"); } }) .setIcon(R.drawable.photo_profile) .setMessage(s) .setTitle(R.string.about_title) .create(); d.show(); ((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
źródło
Najłatwiejszy i najkrótszy sposób jest taki
Link do Androida w oknie dialogowym
((TextView) new AlertDialog.Builder(this) .setTitle("Info") .setIcon(android.R.drawable.ic_dialog_info) .setMessage(Html.fromHtml("<p>Sample text, <a href=\"http://google.nl\">hyperlink</a>.</p>")) .show() // Need to be called after show(), in order to generate hyperlinks .findViewById(android.R.id.message)) .setMovementMethod(LinkMovementMethod.getInstance());
źródło
To jest prosty sposób, którego używam
Strings W strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools"> <string name="credits_title">Credits</string> <string name="confirm">OK</string> <string name="credits">All rights reserved. <a href="https://google.com">Source</a> </string> </resources>
Wymiary W dimens.xml
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools"> <dimen name="margin_8dp">8dp</dimen> <dimen name="margin_32dp">32dp</dimen> </resources>
Pomocnik Dialog klasy
public class MessageHelper { public static void showCreditsDialog(Context context) { AlertDialog alertDialog = new AlertDialog.Builder(context).create(); alertDialog.setTitle(R.string.credits_title); TextView textView = new TextView(context); int padding = (int) context.getResources().getDimension(R.dimen.margin_32dp); int topPadding = (int) context.getResources().getDimension(R.dimen.margin_8dp); textView.setPadding(padding, topPadding, padding, 0); textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setText(R.string.credits); alertDialog.setView(textView); alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, context.getResources().getString(R.string.confirm), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); alertDialog.show(); } }
Jak używać
MessageHelper.showCreditsDialog(this); // this is the context
Zapowiedź
źródło
Łatwa implementacja Kotlina
Zasób ciągu:
<string name="foo"><a href="https://www.google.com/">some link</a></string>
Kod:
AlertDialog.Builder(context) .setMessage(R.string.foo) .show() .apply { findViewById<TextView>(android.R.id.message) ?.movementMethod = LinkMovementMethod.getInstance() }
źródło