2014-06-11 19 views
2
UNHANDLED EXCEPTION: System.InvalidCastException: Cannot cast from source type to destination type. 
06-11 19:39:01.690 I/MonoDroid(17577): at MyApp.Inbox.CorrespondenceActivity.CorrectLinkPaths (ISpanned spanText) [0x00000] in <filename unknown>:0 

这是我得到的异常。当使用Debug配置构建应用程序时,一切正常 - 没有例外,没有任何东西。一旦我构建它用于发布,我就会得到这个异常 - 我无法弄清楚为什么,以及如何解决它。System.InvalidCastException - 在调试中工作,在发布时失败

这是调用方法CorrectLinkPaths代码:

_someTextView.SetText(CorrectLinkPaths(Html.FromHtml(_myMessage.Summary + "\n\n" + _myMessage.Body)), TextView.BufferType.Spannable); 

不用说,_myMessage.Summary和身体HTML串。

我CorrectLinkPaths法看起来是这样的:

private ISpanned CorrectLinkPaths(ISpanned spanText) 
    { 
     Object[] spans = spanText.GetSpans(0, spanText.Length(), Class.FromType(typeof (Object))); 
     foreach (var s in spans) 
     { 
      int start = spanText.GetSpanStart(s); 
      int end = spanText.GetSpanEnd(s); 
      SpanTypes flags = spanText.GetSpanFlags(s); 
      if (s.GetType() == typeof (URLSpan)) 
      { 
       var urlSpan = (URLSpan) s; 
       if (!urlSpan.URL.StartsWith("http")) 
       { 
        if (urlSpan.URL.StartsWith("/")) 
         urlSpan = new URLSpan("http://www.mydomain.com" + urlSpan.URL); 
        else 
         urlSpan = new URLSpan("http://www.mydomain.com/" + urlSpan.URL); 
       } 
       ((ISpannable) spanText).RemoveSpan(s); 
       ((ISpannable) spanText).SetSpan(urlSpan, start, end, flags); 
      } 
     } 
     return spanText; 
    } 

没有人有任何线索,为什么在调试期间工作的,但是当我尝试建立发布,以及如何修复失败?我会非常,非常感谢!

谢谢:)

此致敬礼。

回答

2

解决方案非常简单。在方法,导致错误

((ISpannable) spanText).RemoveSpan(s); 
((ISpannable) spanText).SetSpan(urlSpan, start, end, flags); 

若要解决此方法底部有人铸造不得不更改为以下:

public ISpanned CorrectLinkPaths(ISpanned spanText) 
{ 
    Object[] spans = spanText.GetSpans(0, spanText.Length(), Class.FromType(typeof (Object))); 
    ISpannable spanned = new SpannableString(spanText); 
    foreach (var s in spans) 
    { 
     var start = spanText.GetSpanStart(s); 
     var end = spanText.GetSpanEnd(s); 
     var flags = spanText.GetSpanFlags(s); 

     if (s.GetType() == typeof (URLSpan)) 
     { 
      var urlSpan = (URLSpan)s; 
      if (!urlSpan.URL.StartsWith("http")) 
      { 
       if (urlSpan.URL.StartsWith("/")) 
        urlSpan = new URLSpan("http://www.mydomain.com" + urlSpan.URL); 
       else 
        urlSpan = new URLSpan("http://www.mydomain.com/" + urlSpan.URL); 
      } 
      spanned.RemoveSpan(s); 
      spanned.SetSpan(urlSpan, start, end, flags); 
     } 
    } 
    return spanned; 
} 
0

你应该使用JavaCast,它的工作原理在发布和调试模式下。你将不得不包含命名空间Android.Runtime。

spanText.JavaCast<ISpannable>().RemoveSpan(s); 
spanText.JavaCast<ISpannable>().SetSpan(urlSpan, start, end, flags); 
相关问题