2013-04-15 48 views
0

我在程序中在類B中創建了一個textview。當A級調用它時。在textview中使用鏈接的跨度

它增加了文字說「我去了商店」,我需要單詞「the」作爲一個鏈接。這個我在B類使用該做

sb.setSpan(new MyClickableSpan(Word), start, start+Word.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

這是調用類MyClickableSpan

public class MyClickableSpan extends ClickableSpan { 
private String word; 

public MyClickableSpan(String word) { 
    this.word = word; 
} 

@Override 
public void onClick(View widget) { 

    Log.d("Spaannnned",word); 

} 
} 

所以,當這個鏈接被點擊它顯示在我的日誌了。

但我需要它在類A中運行一個函數並傳入單詞。

回答

0

只需添加一個點擊監聽器接口您跨度:

public class MyClickableSpan extends ClickableSpan { 
public interface SpanClickListener 
{ 
    public void onSpanClicked(View widget, MyClickableSpan span); 
} 
private String word; 
private SpanClickListener clickListener; 

public MyClickableSpan(String word, SpanClickListener listener) { 
    this.word = word; 
    clickListener = listener; 
} 
public String getWord() { return word; } 

@Override 
public void onClick(View widget) { 
     Log.d("Spaannnned",word); 
     if (clickListener != null) clickListener.onSpanClicked(widget, this); 
    } 
} 


然後,在你的活動:

MyClickableSpan span = new MyClickableSpan("Hello!", new MyClickableSpan.SpanClickListener() { 
      @Override 
      public void onSpanClicked(View widget, MyClickableSpan span) 
      { 
       Toast.makeText(context, span.getWord(), Toast.LENGTH_SHORT); 
      } 
     }; 
.... 
//add your span to the Spannable or whatever you want. 
+0

但是不想用這個方法必須在class a中設置span?此刻此刻不是一個選項 – RuAware

+0

那麼,如果你想在A類中調用某些東西,那麼你必須以某種方式爲A類的實例提供一個對B類的引用。除非你使用某種類型的消息總線或消息隊列,我不認爲是這種情況。 – Const

+0

只需在A中創建一個SpanClickListener的實例,然後將其提供給B類,它將在創建跨度時使用它。 – Const

0

供應你的「A類」的實例幫助的MyClickableSpan構造函數,它保存在一個數據成員,並使用從onClick()方法。

或者,使用event bus like Otto讓onClick()發出「A類」訂閱的消息。

+0

奧托看起來很有趣..會看明天。不幸的是,跨度被設置的cllass b。不瞭解class a。 – RuAware