2013-11-03 10 views
14

TextViewでClickableSpanを処理していますが、クリックしたスパンのテキストを取得しようとしています。これは私のコードです。 Android ClickableSpan get text()

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

あなたが見ることができるように

は、私が clickablespan文字へ TextView 12〜17を設定し、私は onClickイベントでこれらの文字を取得したいです。

どうすればいいですか?または、少なくとも12, 17パラメータをonClickイベントに渡すことはできますか?

ありがとうございました!

答えて

28

はこれを試して動作します。必要に応じて

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

ありがとうpskink、それは動作します! – TrungDQ

+1

確かに、in.// TODOsに記載されているチェックを追加します。 – pskink

+2

は複数のクリック可能な単語に対しても機能します:)ありがとう!しかしそれはなぜ機能するのですか? OnClickはtextviewであるビューを受け取るので、tv.getTextを実行すると、他のSpannable単語があったとしてもクリックされたSpannedオブジェクトが返されます。これはどのように機能していますか? @pskink – fersarr

2

編集:前のコードが間違っていた、これは

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

これは本当ですか?私はあなたのコードをまだ実行していませんが、うまくいかないようです...あなたの 'sannableText'は使用されていません、' spanStr'は定義されていません。ところで、 'textView.getText()'は 'SpannableStringBuilder'ではなく' CharSequence'を返します。もう一度確認してください。 – TrungDQ

+0

私はspanStrではなくspannableTextを意味します。私は頭からやった、私は今実際のコードをしてしばらくして更新しています。 –

+0

私はSpannableStringBuilderではなくSpannedTextでも考えていました。とにかく、あなたは正しい、これは動作しません。 getSpansは編集可能です(TextViewではなくEditText) –

4

少し単純で、また、モデルの参照を渡すことができます。

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

次に、この

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のような文字列のspannableが

プライベート静的になります

+0

ねえ、ありがとう!それは私にとって完璧です! –

0

はまた作るために使用することができます( "マイテキスト")新しいSpecialClickableSpanを呼び出しますCustomerTextClickクラスは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 
    } 
} 

テスト済みのワーキングコード。

+0

また、クリックリスナーをforループとして直接使用することもできます。 'for(URLSpan url:urls){ CustomerTextClick click = new CustomerTextClick(url.getURL()); style.setSpan(新しいClickableSpan(){ @Override公共ボイドのonClick(表示ウィジェット){ }}、sp.getSpanStart(URL)、sp.getSpanEnd(URL)、Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)。 } ' –

関連する問題