¿Cómo puedo obtener hipervínculos clicables en AlertDialog desde un recurso de cadena?

Lo que bash lograr es tener hipervínculos clicables en el texto del mensaje que muestra AlertDialog . Si bien la implementación de AlertDialog resalta y colorea AlertDialog cualquier hipervínculo (definido mediante recurso de cadena pasado a Builder.setMessage ) proporcionado, no se puede hacer clic en los enlaces.

El código que estoy usando actualmente se ve así:

 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(); 

Me gustaría evitar usar un WebView para mostrar un fragmento de texto.

Si solo muestra texto y URL [s] en su cuadro de diálogo, tal vez la solución sea más simple

 public static class MyOtherAlertDialog { public static AlertDialog create(Context context) { final TextView message = new TextView(context); // ie: 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(); } } 

Como se muestra aquí http://picasaweb.google.com/lh/photo/up29wTQeK_zuz-LLvre9wQ?feat=directlink

Diálogo de alerta con enlaces clicables

Realmente no me gustó la respuesta más popular actualmente porque cambia significativamente el formato del mensaje en el cuadro de diálogo.

Aquí hay una solución que enlazará el texto de su diálogo sin cambiar el estilo del texto:

  // Linkify the message final SpannableString s = new SpannableString(msg); 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()); 

Esto también debería hacer tags . Tenga en cuenta que acabo de agregar algunas líneas al código de emmby. así que acéptalo

 final AlertDialog d = new AlertDialog.Builder(this) .setPositiveButton(android.R.string.ok, null) .setIcon(R.drawable.icon) .setMessage(Html.fromHtml("Check this link out")) .create(); d.show(); // Make the textview clickable. Must be called after show() ((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); 

En realidad, si desea simplemente usar una cadena sin tratar con todas las vistas, la manera más rápida es encontrar la vista de texto del mensaje y vincularlo:

 d.setMessage("Insert your cool string with links and stuff here"); Linkify.addLinks((TextView) d.findViewById(android.R.id.message), Linkify.ALL); 

JFTR, aquí viene la solución que descubrí después de un tiempo:

 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(); 

El about.xml correspondiente prestado como un fragmento de las fonts de Android se ve así:

     

Las partes importantes son establecer enlaces, hacer clic en true y setMovementMethod (LinkMovementMethod.getInstance ()).

En lugar de …

 AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); dialogBuilder.setTitle(R.string.my_title); dialogBuilder.setMessage(R.string.my_text); 

… ahora uso:

 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); 

Toda la respuesta anterior no eliminará la etiqueta html, etc, si la cadena contiene, intenté eliminar todas las tags, y esto funciona bien para mí

 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("Hello World This is a test of the URL  Example

This text is bold

This text is emphasized

This is computer output

This is subscript and superscript

";)); builder.setView(layout); AlertDialog alert = builder.show();

y el custom_dialog sería como;

     

El código anterior eliminará toda la etiqueta html y muestra el Ejemplo como URL habilitada para hacer clic en todas las demás en el texto de formato html especificado.

No estaba realmente satisfecho con las respuestas actuales. Hay dos cosas que son importantes cuando desea hipervínculos clicables en estilo href con un AlertDialog:

  1. Establezca el contenido como Ver y no como setMessage(…) , ya que solo las Vistas permiten hacer clic en contenido HTML
  2. Establezca el método de movimiento correcto ( setMovementMethod(…) )

Aquí hay un ejemplo mínimo de trabajo:

strings.xml

  Cool Links:\n Stackoverflow\n Android Enthusiasts\n  

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() } … 

He verificado muchas preguntas y respuestas, pero no funciona. Lo hice yo mismo. Este es el fragmento de código en 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()); .... } 

Ponga esta etiqueta en res \ values ​​\ String.xml

 NHK Policy on Protection of Personal Information 

La manera más simple:

 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()); 

Combiné algunas de las opciones discutidas anteriormente para llegar a esta función que me funciona. pasa el resultado al método SetView () del constructor de diálogos.

 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; } 

Si está utilizando un DialogFragment , esta solución debería ayudar.

 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()); } } 

Para hacerlo, especifico el cuadro de alerta en un recurso XML y lo cargo. Consulte, por ejemplo, about.xml (consulte la ID de ABOUT_URL) que se crea una instancia cerca del final de ChandlerQE.java . Las partes relevantes del código 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) 

Esta es mi solución. Crea un enlace normal sin tags html involucradas y sin ninguna URL visible. También mantiene el diseño intacto.

 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());