2012-08-05 12 views
9

He estado usando el android:autoLink muy bien para el formato de enlaces y tal, pero tengo que usar así que no puedo usar eso en este caso. El razonamiento es que me parece demasiado fácil hacer clic en un número de teléfono accidentalmente, por lo que voy a interceptar el clic con una confirmación Dialog y luego llamar.Formato TextView para que parezca un enlace

¿Hay una manera fácil de seguir haciendo que el número de teléfono en mi TextView parezca un enlace normal en el que se puede hacer clic? Busqué el código fuente de Android, pero no pude encontrar ningún estilo en particular para que lo referenciara.

+0

Una solución sería extender ClickableSpan para hacer su propia manipulación costumbre de hacer clic en el enlace: http://developer.android.com/reference/android/text/style/ClickableSpan.html Consulte también este hilo: http://stackoverflow.com/questions/11413399/open-textview-links-at-another-activity-not- default-browser – almalkawi

Respuesta

3
  • Puede crear un archivo de recursos colors.xml, que contiene colores. Por favor, eche un vistazo a Colors
  • Si desea subrayar el texto, por favor, eche un vistazo a este post: Underline
  • No se olvide de añadir android:clickable="true" o setClickable(true) a sus TextViews para hacerlos hacer clic!
3

Para subrayar el texto de su TextView, usted tiene que hacer algo como:

final TextView text = (TextView) findViewById(R.id.text); 

SpannableString string = new SpannableString("This is the uderlined text."); 
string.setSpan(new UnderlineSpan(), 0, string.length(), 0); 
text.setText(string); 

Esto debería funcionar. Déjame saber sobre tu progreso.

+0

simplemente reemplace el contenido con una cadena y solo su código funcionará bien. porque el contenido no es nada aquí. –

+0

@RobiKumarTomar, ¡Gracias! Estás absolutamente en lo correcto. – yugidroid

3

Linkify es una gran clase, que busca patrones complejos como URL, números de teléfono, etc. y los convierte en URLSpans. En lugar de volver a escribir las expresiones regulares existentes, amplié la clase URLSpan y creé un método para actualizar solo el URLSpans del teléfono a una URLSpan personalizada con un cuadro de diálogo de confirmación.

Primera mi clase URLSpan extendida, ConfirmSpan:

class ConfirmSpan extends URLSpan { 
    AlertDialog dialog; 
    View mView; 

    public ConfirmSpan(URLSpan span) { 
     super(span.getURL()); 
    } 

    @Override 
    public void onClick(View widget) { 
     mView = widget; 

     if(dialog == null) { 
      AlertDialog.Builder mBuilder = new AlertDialog.Builder(widget.getContext()); 
      mBuilder.setMessage("Do you want to call: " + getURL().substring(4) + "?"); 
      mBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        openURL(); 
       } 
      }); 
      dialog = mBuilder.create(); 
     } 
     dialog.show(); 
    } 

    public void openURL() { 
     super.onClick(mView); 
    } 
} 

Siguiente el método para intercambiar las diferentes clases abarcan:

private void swapSpans(TextView textView) { 
    Spannable spannable = (Spannable) textView.getText(); 
    URLSpan[] spans = textView.getUrls(); 
    for(URLSpan span : spans) { 
     if(span.getURL().toString().startsWith("tel:")) { 
      spannable.setSpan(new ConfirmSpan(span), spannable.getSpanStart(span), spannable.getSpanEnd(span), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      spannable.removeSpan(span); 
     } 
    } 
} 

Finalmente todo lo que tiene que hacer es crear un TextView con el atributo autoLink:

android:autoLink="phone" 

Y recuerde llamar al método swapSpans(). Entiendo que escribí esto por diversión, puede haber otros métodos para hacerlo, pero no los conozco en este momento. ¡Espero que esto ayude!

+0

¡Gracias, esto se ve muy bien! Trataré de implementarlo pronto y veré cómo funciona. :) –

8

Ésta es la solución más corta:

final CharSequence text = tv.getText(); 
final SpannableString spannableString = new SpannableString(text); 
spannableString.setSpan(new URLSpan(""), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
tv.setText(spannableString, TextView.BufferType.SPANNABLE); 

Lamentablemente, el efecto de clic no se muestra como se hace clic en un enlace URL real, pero se puede superar de este modo:

final CharSequence text = tv.getText(); 
    final SpannableString notClickedString = new SpannableString(text); 
    notClickedString.setSpan(new URLSpan(""), 0, notClickedString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
    final SpannableString clickedString = new SpannableString(notClickedString); 
    clickedString.setSpan(new BackgroundColorSpan(Color.GRAY), 0, notClickedString.length(), 
      Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 
    tv.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(final View v, final MotionEvent event) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       tv.setText(clickedString); 
       break; 
      case MotionEvent.ACTION_UP: 
       tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
       v.performClick(); 
       break; 
      case MotionEvent.ACTION_CANCEL: 
       tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
       break; 
      } 
      return true; 
     } 
    }); 

Otra solución es usar Html.fromHtml (...), donde el texto dentro tiene etiquetas de enlaces ("").

Si desea otra solución, marque this post.

0

Tiene una respuesta mejor. Esto es lo que hice.

 final SpannableString ss = new SpannableString("Click here to verify Benificiary"); 
     ClickableSpan clickableSpan = new ClickableSpan() { 
      @Override 
      public void onClick(View textView) { 

      } 
      @Override 
      public void updateDrawState(TextPaint ds) { 
       super.updateDrawState(ds); 
       ds.setUnderlineText(false); 
      } 
     }; 
     ss.setSpan(clickableSpan,0,ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setMovementMethod(LinkMovementMethod.getInstance()); 
     textView.setHighlightColor(Color.BLUE); 

ir a ninguna parte que te gusta cuando el usuario hace clic en el enlace a través del método onclick de ClickableSpan

Cuestiones relacionadas