2013-12-20 15 views
0

你好,stackoverflow社區!Android:水平滾動,可展開的文本不能一起工作

我有一個小問題,在Google上搜索了幾天後,我想尋求您的幫助。

我想要達到的目標是在Android中使用可點擊的部件在滾動文本。到目前爲止,滾動部分正在工作,並且點擊到,但遺憾的是,當我單擊整個文本的跨度時,只有與第一個跨度鏈接的onClick偵聽器被調用,而且從來沒有鏈接到跨度的那個被點擊。

這裏是我到目前爲止的代碼(因爲Xamarin的C#代碼):

SpannableStringBuilder scrollingTextBuilder = new SpannableStringBuilder(); 
foreach(DataStruct detail in dbExchange.DataList) 
{ 
    SpannableStringBuilder singleTextBuilder = new SpannableStringBuilder(detail.timeSlot + ": " + detail.videoName); 
    singleTextBuilder.SetSpan(new SpanClickHelper(detail.videoID), 0, singleTextBuilder.Length(), SpanTypes.ExclusiveExclusive); 
    scrollingTextBuilder.Append(singleTextBuilder); 
} 

TextView scrollingTextView = (TextView) FindViewById(Resource.Id.scrollingTextView); 

scrollingTextView.MovementMethod = LinkMovementMethod.Instance; 
scrollingTextView.SetText(scrollingTextBuilder, TextView.BufferType.Spannable); 
scrollingTextView.StartAnimation((Animation)AnimationUtils.LoadAnimation(this, Resource.Animation.scrollAnim)); 

而這裏SpanClickHelper類:

public class SpanClickHelper : ClickableSpan 
{ 
    private string videoID; 

    public SpanClickHelper(string videoID) 
    { 
     this.videoID = videoID; 
    } 

    #region implemented abstract members of ClickableSpan 

    public override void OnClick(global::Android.Views.View widget) 
    { 
     Console.WriteLine("clicked: " + videoID); 
    } 

    #endregion 
} 

我希望你知道一個或兩個尖讓我上正確的軌道。希望我沒有完全錯誤的旅行。

+0

你檢查是否每一個細節有不同的detail.videoID? – pskink

+0

@pskink是的,他們都有不同的值 – Nyanko

+0

而不是WriteLining videoID嘗試WriteLine HashCode() – pskink

回答

0

試試這個(把它放在onCreate()方法)

ScrollView sv = new ScrollView(this); 
TextView tv = new TextView(this); 
tv.setTextSize(32); 
tv.setMovementMethod(LinkMovementMethod.getInstance()); 
SpannableStringBuilder b = new SpannableStringBuilder(); 
for (int i = 0; i < 5; i++) { 
    String link = "#" + i; 
    SpannableStringBuilder tmp = new SpannableStringBuilder(); 
    tmp.append("link " + link); 
    ClickableSpan span = new CS(link); 
    tmp.setSpan(span, 0, tmp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    tmp.append("\n\n\n"); 
    b.append(tmp); 
} 
tv.setText(b); 
sv.addView(tv); 

setContentView(sv); 

Printer printer = new LogPrinter(Log.DEBUG, TAG); 
TextUtils.dumpSpans(b, printer, "spans: "); 

類CS的樣子:

class CS extends ClickableSpan { 
    private String s; 

    public CS(String s) { 
     this.s = s; 
    } 

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

爲標誌== Spanned.SPAN_EXCLUSIVE_EXCLUSIVE在setSpan()我得到了(注意前佛羅里達州= ...範圍):

D/Main ( 386): spans: link #0: 43dccd60 org.pskink.pathdrawable.Main.CS (0-7) fl=#33 
D/Main ( 386): spans: link #1: 43dcd138 org.pskink.pathdrawable.Main.CS (10-17) fl=#33 
D/Main ( 386): spans: link #2: 43dcd468 org.pskink.pathdrawable.Main.CS (20-27) fl=#33 
D/Main ( 386): spans: link #3: 43dcd780 org.pskink.pathdrawable.Main.CS (30-37) fl=#33 
D/Main ( 386): spans: link #4: 43dcda10 org.pskink.pathdrawable.Main.CS (40-47) fl=#33 

爲標誌== Spanned.SPAN_INCLUSIVE_INCLUSIVE(我刪除了大量輸出,因爲在這裏所有的跨度 延伸到緩衝區的末尾,見*低於-50),你可以看到該鏈接#0具有範圍0-50和 這個跨度攔截所有點擊:

D/Main ( 470): spans: link #0 [cut] : 43dccd60 org.pskink.pathdrawable.Main.CS (0-50) fl=#18 
D/Main ( 470): spans: link #1 [cut] : 43dcd138 org.pskink.pathdrawable.Main.CS (10-50) fl=#18 
D/Main ( 470): spans: link #2 [cut] : 43dcd468 org.pskink.pathdrawable.Main.CS (20-50) fl=#18 
D/Main ( 470): spans: link #3 [cut] : 43dcd780 org.pskink.pathdrawable.Main.CS (30-50) fl=#18 
D/Main ( 470): spans: link #4 [cut] : 43dcda10 org.pskink.pathdrawable.Main.CS (40-50) fl=#18 
+0

感謝您的代碼示例。可悲的是我無法讓它在我身邊工作。也許問題在於TextView是在一個Horizo​​ntalView中,因爲文本比手機寬度更長,這就造成了問題?當我將標誌更改爲SPAN_INCLUSIVE_INCLUSIVE時,整個文本在我單擊時突出顯示,但使用SPAN_EXCLUSIVE_EXCLUSIVE時只有第一個跨度突出顯示,即使我單擊另一部分時也是如此。 – Nyanko

+0

好的,所以嘗試刪除ScrollView和使用setContentView(電視) – pskink

+0

好吧,忘記我以前的評論,並嘗試首先將我的java代碼轉換爲C#並查看它是否有效 – pskink