2013-11-03 14 views
14

Tôi đang làm việc trên ClickableSpan trong một TextView và tôi đang cố gắng lấy văn bản của phạm vi được nhấp. Đây là mã của tôi.Android ClickableSpan nhận văn bản 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); 

Như bạn thấy, tôi đặt clickablespan các các TextView để ký tự từ 12 đến 17, và tôi muốn để có được những nhân vật này trong trường hợp onClick.

Tôi có thể làm điều đó không? Hoặc ít nhất tôi có thể chuyển thông số 12, 17 tới onClick sự kiện?

Cảm ơn bạn!

Trả lời

28

thử điều này:

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

Cảm ơn bạn pskink, nó hoạt động! – TrungDQ

+1

chắc chắn, nó ... thêm các kiểm tra được đề cập trong.// TODOs – pskink

+2

hoạt động ngay cả đối với nhiều từ có thể nhấp :) cảm ơn! Nhưng tại sao nó hoạt động? do đó OnClick nhận được xem đó là textview, sau đó làm tv.getText trả về đối tượng Spanned đã nhấp ngay cả khi có các từ Spannable khác. Làm thế nào là làm việc này? @pskink – fersarr

2

được sửa đổi: Đoạn mã trên là sai, việc này

// 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

Bạn có chắc chắn về điều này không? Tôi chưa chạy mã của bạn nhưng có vẻ như không hoạt động ... 'sannableText' của bạn không được sử dụng,' spanStr' chưa được xác định. Và bằng cách này, 'textView.getText()' trả về một 'CharSequence', không phải là' SpannableStringBuilder' ... Bạn có thể kiểm tra lại không? – TrungDQ

+0

Tôi có nghĩa là spannableText thay vì spanStr. Tôi đã làm từ đầu, tôi đang làm một mã thực sự bây giờ và cập nhật trong một thời gian. –

+0

Tôi cũng đang nghĩ đến SpannedText, thay vì SpannableStringBuilder. Dù sao, bạn nói đúng, điều này không hoạt động. getSpans là dành cho Editable (EditText, không phải TextView) –

4

Một chút đơn giản, cũng có thể vượt qua một tài liệu tham khảo mô hình nếu cần thiết.

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 + "]"); 
    } 
} 

Sau đó gọi mới SpecialClickableSpan ("Văn bản của tôi")

+0

Xin chào, cảm ơn! nó hoàn hảo cho tôi! –

0

Bạn cũng có thể sử dụng để làm cho chuỗi spannable như thế này

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

CustomerTextClick sẽ

tĩnh tin lớp CustomerTextClick mở rộng ClickableSpan {

private String mUrl; 

    CustomerTextClick(String url) { 
     mUrl = url; 
    } 

    @Override 
    public void onClick(View widget) { 
     // TODO Auto-generated method stub 
     //Toast.makeText(ctx, "hello google!",Toast.LENGTH_LONG).show(); 
     // Do your action here 
    } 
} 

Mã thử nghiệm và làm việc.

+0

Bạn cũng có thể sử dụng trình nghe nhấp chuột trực tiếp trong vòng lặp là 'cho (URL url url: url) { CustomerTextClick nhấp = new CustomerTextClick (url.getURL()); style.setSpan (ClickableSpan mới() {@Override public void onClick (Xem widget) {} }, sp.getSpanStart (url), sp.getSpanEnd (url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } ' –

Các vấn đề liên quan