2012-08-05 16 views
9

Sto usando il android:autoLink bene per la formattazione dei collegamenti e così via, ma ho bisogno di usare quindi non posso usarlo in questo caso. Il ragionamento è che trovo troppo facile fare clic su un numero di telefono accidentalmente, quindi interromperò il clic con una conferma Dialog e poi chiamerò.Formato TextView per apparire come link

C'è un modo semplice per rendere ancora il numero di telefono nel mio TextView come un normale collegamento cliccabile? Ho analizzato il codice sorgente di Android, ma non sono riuscito a trovare uno stile particolare per farmi riferimento.

+0

Una soluzione potrebbe essere quella di estendere la ClickableSpan di fare il proprio trattamento personalizzato del cliccando sul link: http://developer.android.com/reference/android/text/style/ClickableSpan.html Controlla anche questo thread: http://stackoverflow.com/questions/11413399/open-textview-links-at-another-activity-not- default-browser – almalkawi

risposta

3
  • È possibile creare un file di risorse colors.xml, che contiene i colori. Si prega di dare un'occhiata a Colors
  • Se si vuole sottolineare il testo, quindi si prega di dare un'occhiata a questo post: Underline
  • Non dimenticare di aggiungere android:clickable="true" o setClickable(true) a tuoi TextViews per renderli cliccabili!
3

Per sottolineare il testo del vostro TextView, devi fare qualcosa di simile:

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

Questo dovrebbe funzionare. Fammi sapere dei tuoi progressi.

+0

basta sostituire il contenuto con una stringa e solo il tuo codice funzionerà correttamente. perché il contenuto non è niente qui. –

+0

@RobiKumarTomar, grazie! Hai assolutamente ragione. – yugidroid

3

Linkify è una grande classe, è alla ricerca di schemi complessi come URL, numeri di telefono, ecc. E li trasforma in URLSpans. Piuttosto che riscrivere le espressioni regolari esistenti ho esteso la classe URLSpan e ho creato un metodo per aggiornare solo l'URL del telefono su un URLSpan personalizzato con una finestra di dialogo di conferma.

prima mia classe URLSpan esteso, 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); 
    } 
} 

Avanti il metodo per scambiare le diverse classi campata:

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

Infine tutto quello che dovete fare è creare un TextView con l'attributo autoLink:

android:autoLink="phone" 

E ricordarsi di chiamare il metodo swapSpans(). Capisco che l'ho scritto per divertimento, ci possono essere altri metodi per farlo, ma al momento non ne sono a conoscenza. Spero che questo ti aiuti!

+0

Grazie, sembra molto bello! Proverò a implementarlo presto e vedere come va. :) –

8

Questa è la soluzione più breve:

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

Purtroppo, l'effetto di clic non si presenta come essere cliccato su un vero link URL, ma si può superare in questo 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; 
     } 
    }); 

Un'altra soluzione è utilizzare Html.fromHtml (...), dove il testo all'interno contiene tag di collegamento ("").

Se si desidera un'altra soluzione, selezionare this post.

0

Avere una risposta migliore. Questo è quello che ho fatto.

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

Si va da nessuna parte che ti piace quando l'utente fa clic sul collegamento con il metodo onclick di ClickableSpan