2012-08-05 11 views
9

Używam właśnie android:autoLink, tylko dla celów formatowania linków i podobnych, ale muszę użyć , więc nie mogę tego użyć w tym przypadku. Rozumowanie jest takie, że zbyt łatwo kliknę przypadkowo numer telefonu, więc przechwycę kliknięcie z potwierdzeniem Dialog, a następnie zadzwonię.Formatowanie TextView, aby wyglądać jak link

Czy istnieje łatwy sposób, aby nadal numer telefonu w moim TextView wyglądał jak zwykły klikalny link? Sprawdziłem kod źródłowy Androida, ale nie mogłem znaleźć żadnego konkretnego stylu do odniesienia.

+0

Jednym rozwiązaniem byłoby rozszerzenie ClickableSpan zrobić własną obsługę niestandardowej klikając na link: http://developer.android.com/reference/android/text/style/ClickableSpan.html Sprawdź również ten wątek: http://stackoverflow.com/questions/11413399/open-textview-links-at-another-activity-not- domyślna przeglądarka – almalkawi

Odpowiedz

3
  • Można utworzyć plik zasobów colors.xml, który zawiera kolory. Proszę spojrzeć na Colors
  • Jeśli chcesz podkreślić swój tekst, to proszę spojrzeć na to stanowisko: Underline
  • Nie zapomnij dodać android:clickable="true" lub setClickable(true) do swoje TextView aby je klikać!
3

Aby podkreślić tekst na swojej TextView, trzeba zrobić coś takiego:

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

To powinno działać. Daj mi znać o twoich postępach.

+0

po prostu zastępuje zawartość ciągiem, a wtedy tylko twój kod będzie działał poprawnie. ponieważ treść nie jest tutaj. –

+0

@RobiKumarTomar, Dzięki! Masz całkowitą rację. – yugidroid

3

Linkify to świetna klasa, szuka skomplikowanych wzorców, takich jak adresy URL, numery telefonów itp. I zamienia je w URLSpans. Zamiast ponownie pisać istniejące wyrażenia regularne, rozszerzyłem klasę URLSpan i utworzyłem metodę aktualizacji tylko telefonu URLSpans do niestandardowego URLSpan z dialogiem potwierdzenia.

Pierwszy mój rozszerzony klasa URLSpan, 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); 
    } 
} 

Następny sposób, aby zamienić się z różnych klas Okres:

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

Wreszcie wszystko, co trzeba zrobić, to Utwórz TextView z atrybutem autoLink:

android:autoLink="phone" 

Pamiętaj, aby wywołać metodę swapSpans(). Zrozum, że napisałem to dla zabawy, mogą istnieć inne metody robienia tego, ale nie jestem w tej chwili o nich poinformowany. Mam nadzieję że to pomoże!

+0

Dziękuję, to wygląda bardzo ładnie! Postaram się go wkrótce wdrożyć i zobaczyć, jak to działa. :) –

8

Jest to najkrótsza rozwiązanie:

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

Niestety, efekt przyciskiem nie pojawi się jako kliknięciu na prawdziwym link URL, ale można go pokonać tak:

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

Innym rozwiązaniem jest użycie pliku Html.fromHtml (...), w którym tekst wewnątrz zawiera znaczniki odsyłaczy ("").

Jeśli chcesz, aby inne rozwiązanie, sprawdź this post.

0

Miej lepszą odpowiedź. Tak właśnie zrobiłem.

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

iść gdziekolwiek chcesz, kiedy użytkownik kliknie link poprzez onclick metody ClickableSpan

Powiązane problemy