2013-11-03 20 views
14

Bir TextView'da ClickableSpan üzerinde çalışıyorum ve tıklanan span metnini almaya çalışıyorum. Bu benim kodum. Android ClickableSpan metin al onClick()

// this is the text we'll be operating on 
SpannableString text = new SpannableString("Lorem ipsum dolor sit amet"); 

// make "dolor" (characters 12 to 17) display a toast message when touched 
ClickableSpan clickableSpan = new ClickableSpan() { 
    @Override 
    public void onClick(View view) { 
     // This will get "Lorem ipsum dolor sit amet", but I just want "dolor" 
     String text = ((TextView) view).getText().toString(); 
     Toast.makeText(context, text, Toast.LENGTH_LONG).show(); 
    } 
}; 

text.setSpan(clickableSpan, 12, 17, 0); 

Gördüğünüz gibi

, ben clickablespan karaktere TextView 12'den 17'ye ayarlı ve ben onClick olay bu karakterleri almak istiyorum.

Bunu yapabilir miyim? Ya da en azından 12, 17 parametresini onClick olayına iletebilir miyim?

Teşekkür ederiz!

cevap

28

bu deneyin çalışır: Gerekirse

public class LoremIpsumSpan extends ClickableSpan { 
    @Override 
    public void onClick(View widget) { 
     // TODO add check if widget instanceof TextView 
     TextView tv = (TextView) widget; 
     // TODO add check if tv.getText() instanceof Spanned 
     Spanned s = (Spanned) tv.getText(); 
     int start = s.getSpanStart(this); 
     int end = s.getSpanEnd(this); 
     Log.d(TAG, "onClick [" + s.subSequence(start, end) + "]"); 
    } 
} 
+0

Teşekkür ederim pskink, işe yarıyor! – TrungDQ

+1

elbette, bu ... 'da belirtilen kontrolleri ekleyin. TODOs – pskink

+2

, birden fazla tıklanabilir sözcük için bile çalışıyor :) teşekkürler! Ama neden işe yarıyor? Böylece OnClick, metin görünümü olan görünümü alır, daha sonra tv.getText yapmak, diğer Spannable kelimeleri olsa bile tıklatılmış Spanned nesnesini döndürür. Bu nasıl çalışıyor? @pskink – fersarr

2

Düzenlendi: önceki kod yanlış olduğunu, bu

// make "dolor" (characters 12 to 17) display a toast message when touched 
    ClickableSpan clickableSpan = new ClickableSpan() { 
     @Override 
     public void onClick(View view) { 
      TextView textView = (TextView) view; 
      CharSequence charSequence = textView.getText(); 
      if (charSequence instanceof Spannable) { 
       Spannable spannableText = (Spannable)charSequence; 
       ClickableSpan[] spans = spannableText.getSpans(0, textView.length(), ClickableSpan.class); 
       for (ClickableSpan span : spans) { 
        int start = spannableText.getSpanStart(span); 
        int end = spannableText.getSpanEnd(span); 
        Toast.makeText(MainActivity.this, charSequence.subSequence(start, end), Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    }; 
+0

Bundan emin misiniz? Kodunuzu henüz çalıştırmadım ama işe yaramayacak gibi görünüyor ... sizin 'sannableText' kullanılmıyor, 'spanStr' tanımlanmadı. Ve bu arada, 'textView.getText()' bir 'CharSequence ', bir' SpannableStringBuilder' döndürmez ... Tekrar kontrol edebilir misiniz? – TrungDQ

+0

spanStr yerine spannableText demek istiyorum. Kafamdan yaptım, şimdi gerçek bir kod yapıyorum ve bir süre sonra güncelliyorum. –

+0

SpannableStringBuilder yerine SpannedText'de de düşünüyordum. Her neyse, haklısın, bu işe yaramıyor. getSpans Düzenlenebilirdir (EditText, TextView değil) –

4

Biraz daha basit, aynı zamanda bir model referans geçebileceği.

public class SpecialClickableSpan extends ClickableSpan { 

    String text; 

    public SpecialClickableSpan(String text){ 
     super(); 
     this.text = text; 
    } 

    @Override 
    public void onClick(View widget) { 
     Log.d(TAG, "onClick [" + text + "]"); 
    } 
} 

O zaman bu

String htmlLinkText = "Lorem ipsum <a href='http://www.google.com'>dolor</a> sit amet"; 
    testView.setText(Html.fromHtml(htmlLinkText)); 
    testView.setMovementMethod(LinkMovementMethod.getInstance()); 

    CharSequence text = testView.getText(); 
    if (text instanceof Spannable) { 
     int end = text.length(); 
     Spannable sp = (Spannable) testView.getText(); 
     URLSpan[] urls = sp.getSpans(0, end, URLSpan.class); 
     SpannableStringBuilder style = new SpannableStringBuilder(text); 
     style.clearSpans();//should clear old spans 
     for (URLSpan url : urls) { 
      CustomerTextClick click = new CustomerTextClick(url.getURL()); 
      style.setSpan(click, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
     testView.setText(style); 
    } 

ve CustomerTextClick gibi dize spannable

özel statik olacak

+0

Hey, teşekkürler! benim için mükemmel! –

0

Ayrıca yapmak için kullanabilirsiniz ("My Metin") yeni SpecialClickableSpan çağrı customerTextClick sınıfı, ClickableSpan {

uzantısını genişletiyor

Test edilmiş ve çalışan kod.

+0

Ayrıca tıklama dinleyicisini doğrudan döngü için '(URLSpan URL: URL'ler) olarak kullanabilirsiniz { CustomerTextClick click = new CustomerTextClick (url.getURL()); style.setSpan (yeni ClickableSpan() { @Override public void onClick (Görünüm widget) { } }, sp.getSpanStart (URL), sp.getSpanEnd (URL), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } ' –

İlgili konular