【问题标题】:InvalidCastException in release when casting TextFormatted to ISpannable or ISpanned将 TextFormatted 转换为 ISpannable 或 ISpanned 时,发布时出现 InvalidCastException
【发布时间】:2015-10-16 14:25:53
【问题描述】:

This 的问题是一样的,但它似乎没有回答为什么这个转换在发布模式下失败但在调试中有效的问题。

Android 文档指定:

返回 TextView 正在显示的文本。如果调用了 setText() 使用 BufferType.SPANNABLE 或 BufferType.EDITABLE 的参数,您 可以将此方法的返回值转换为 Spannable 或 Editable, 分别。注意:返回值的内容不应该是 修改的。如果你想要一个可修改的,你应该制作自己的副本 首先。

如果我在调试中运行以下它可以工作,在发布时它会抛出一个InvalidCastException

var editText = FindViewById<EditText>(Resource.Id.MyEditText);
editText.SetText("hello", TextView.BufferType.Spannable);
var myTextView = FindViewById<TextView>(Resource.Id.MyTextView);

try
{
    ISpannable t21 = (ISpannable)editText.TextFormatted;
    ISpanned t22 = (ISpanned)editText.TextFormatted;
}
catch (Exception exception)
{
    myTextView.Text = exception.Message;
}

FATAL EXCEPTION: main
06-09 16:30:34.135 E/AndroidRuntime(31672): Process: App27.App27, PID: 31672
06-09 16:30:34.135 E/AndroidRuntime(31672): java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
06-09 16:30:34.135 E/AndroidRuntime(31672): Caused by: md52ce486a14f4bc06-09 16:30:34.135 E/AndroidRuntime(31672):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-09 16:30:34.135 E/AndroidRuntime(31672):     at dalvik.system.NativeStart.main(Native Method)
06-09 16:30:34.135 E/AndroidRuntime(31672): Caused by: java.lang.reflect.InvocationTargetException
06-09 16:30:34.135 E/AndroidRuntime(31672):     at java.lang.reflect.Method.invokeNative(Native Method)
06-09 16:30:34.135 E/AndroidRuntime(31672):     at java.lang.reflect.Method.invoke(Method.java:515)
06-09 16:30:34.135 E/AndroidRuntime(31672):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-09 16:30:34.135 E/AndroidRuntime(31672):     ... 2 more
06-09 16:30:34.135 E/AndroidRuntime(31672): Caused by: md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable: System.InvalidCastException: Cannot cast from source type to destination type.
06-09 16:30:34.135 E/AndroidRuntime(31672): at App27.MainActivity.OnCreate (Android.OS.Bundle) [0x00074] in d:\Users\dbeattie\Documents\Visual Studio 2013\Projects\App27\App27\MainActivity.cs:29
06-09 16:30:34.135 E/AndroidRuntime(31672): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) <IL 0x00013, 0x000ef>
06-09 16:30:34.135 E/AndroidRuntime(31672): at (wrapper dynamic-method) object.6917b467-8852-465b-9332-eaefa6fe6832 (intptr,intptr,intptr) <IL 0x00017, 0x00043>

版本信息:

Xamarin 3.11.590.0 (5160db7) Visual Studio 扩展启用 Xamarin.iOS 和 Xamarin.Android 的开发。

Xamarin.Android 5.1.3.1 (d419c934e6ce2113653ff4c40214e3a5d5a69440) 支持 Xamarin.Android 开发的 Visual Studio 插件。

【问题讨论】:

  • 显然您已经添加了某种跟踪并且知道editText 的确切类型 - 使用此类信息更新帖子可能对任何试图回答的人有所帮助...

标签: c# android xamarin xamarin.android


【解决方案1】:

我能够重新创建您的问题。虽然我无法确切地告诉你为什么会发生这种情况,但我确实注意到了这一点。这可能是 Xamarin.Android 中的错误和/或链接器过于激进并且正在执行导致 InvalidCastException 的操作,这就是我所做的。

在我的发布配置中,我的链接器设置为“仅限 SDK 程序集”。发生了 InvalidCastException。当我将链接器设置为“不链接”时,没有发生 InvalidCastException。这使其类似于链接器设置为“不链接”的调试配置。

所以看起来链接器正在剥离一些需要的东西和/或错误是 Xamarin.Android。

但是,我确实找到了适用于 Debug as Release 的解决方案。由于 ISpannable 和 ISpanned 对象是 Java 对象到 Java 对象的桥梁,并且最终将实现 Java.Lang.Obj,所以我通常在转换这些对象时使用 JavaCast。在转换 C# 对象时,我使用 () 或“as”关键字。在这种情况下,由于您正在尝试转换 Java 对象(包装器),因此正确的转换方法将是使用 JavaCast,如下所示:

var editText = FindViewById<EditText>(Resource.Id.MyEditText);
editText.SetText("hello", TextView.BufferType.Spannable);
var myTextView = FindViewById<TextView>(Resource.Id.MyTextView);

try
{
    ISpannable t21 = editText.TextFormatted.JavaCast<ISpannable>();
    ISpanned t22 = editText.TextFormatted.JavaCast<ISpanned>();
}
catch (Exception exception)
{
    myTextView.Text = exception.Message;
}

使用此方法适用于调试和发布配置,包括将链接器设置为“不链接”和“仅 SDK 程序集”。

无论哪种方式,我都可能通过在http://bugzilla.xamarin.com 上提交错误报告来让 Xamarin 人员知道。无论如何,我认为在这种情况下使用 JavaCast (因为您正在转换 java 包装器)是在这种情况下进行转换的正确方法。

【讨论】:

  • 很好,我没想过要尝试使用 JavaCast。刚刚测试过,它可以工作。
猜你喜欢
  • 2020-10-13
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多