将 TextFormatted 转换为 ISpannable 或 ISpanned 时发布的 InvalidCastException
InvalidCastException in release when casting TextFormatted to ISpannable or ISpanned
This 问题是一样的,但它似乎没有回答为什么这个转换在发布模式下失败但在调试中工作的问题。
Android 文档指定:
Return the text the TextView is displaying. If setText() was called
with an argument of BufferType.SPANNABLE or BufferType.EDITABLE, you
can cast the return value from this method to Spannable or Editable,
respectively. Note: The content of the return value should not be
modified. If you want a modifiable one, you should make your own copy
first.
如果我 运行 以下在调试中有效,在发布中它抛出一个 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 extension to enable
development for Xamarin.iOS and Xamarin.Android.
Xamarin.Android 5.1.3.1 (d419c934e6ce2113653ff4c40214e3a5d5a69440)
Visual Studio plugin to enable development for Xamarin.Android.
我能够重现您的问题。虽然我不能确切地告诉你为什么会发生这种情况,但我确实注意到了这一点。这可能是 Xamarin.Android and/or 中的一个错误,链接器过于激进并且做了一些导致 InvalidCastException 的事情,这就是我所做的。
在我的发布配置中,我的链接器设置为 "SDK Assemblies Only"。 InvalidCastException 发生了。当我将链接器设置为 "Don't Link" 时,InvalidCastException 没有发生。这使其类似于链接器设置为 "Don't Link".
的调试配置
所以看起来链接器正在剥离一些需要的东西and/or一个错误是Xamarin.Android。
但是,我确实找到了一个既适用于调试又适用于发布的解决方案。由于 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;
}
使用此方法适用于调试和发布配置,包括将链接器设置为 "Don't Link" 和 "SDK Assemblies Only"。
无论如何,我可能会通过在 http://bugzilla.xamarin.com 上提交错误报告让 Xamarin 人员知道。无论如何,我认为在这种情况下使用 JavaCast<>(因为你正在投射 java 包装器)是在这种情况下投射的正确方法。
This 问题是一样的,但它似乎没有回答为什么这个转换在发布模式下失败但在调试中工作的问题。
Android 文档指定:
Return the text the TextView is displaying. If setText() was called with an argument of BufferType.SPANNABLE or BufferType.EDITABLE, you can cast the return value from this method to Spannable or Editable, respectively. Note: The content of the return value should not be modified. If you want a modifiable one, you should make your own copy first.
如果我 运行 以下在调试中有效,在发布中它抛出一个 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 extension to enable development for Xamarin.iOS and Xamarin.Android.
Xamarin.Android 5.1.3.1 (d419c934e6ce2113653ff4c40214e3a5d5a69440) Visual Studio plugin to enable development for Xamarin.Android.
我能够重现您的问题。虽然我不能确切地告诉你为什么会发生这种情况,但我确实注意到了这一点。这可能是 Xamarin.Android and/or 中的一个错误,链接器过于激进并且做了一些导致 InvalidCastException 的事情,这就是我所做的。
在我的发布配置中,我的链接器设置为 "SDK Assemblies Only"。 InvalidCastException 发生了。当我将链接器设置为 "Don't Link" 时,InvalidCastException 没有发生。这使其类似于链接器设置为 "Don't Link".
的调试配置所以看起来链接器正在剥离一些需要的东西and/or一个错误是Xamarin.Android。
但是,我确实找到了一个既适用于调试又适用于发布的解决方案。由于 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;
}
使用此方法适用于调试和发布配置,包括将链接器设置为 "Don't Link" 和 "SDK Assemblies Only"。
无论如何,我可能会通过在 http://bugzilla.xamarin.com 上提交错误报告让 Xamarin 人员知道。无论如何,我认为在这种情况下使用 JavaCast<>(因为你正在投射 java 包装器)是在这种情况下投射的正确方法。