尝试为 Android 扩展 XML 布局时出现 Eclipse ClassCastException

Posted

技术标签:

【中文标题】尝试为 Android 扩展 XML 布局时出现 Eclipse ClassCastException【英文标题】:Eclipse ClassCastException when trying to expand XML layout for Android 【发布时间】:2011-01-05 21:57:10 【问题描述】:

我是 java、eclipse 和 android 开发的新手,所以我可能会遗漏一些简单的东西,尽管我已经检查了几次基本的东西,比如拼写。

由于公共 Android SDK 中没有数字选择器控件(例如日期选择器中使用的控件),conventional wisdom 是“克隆并拥有”Android 源中存在的控件。

为了做到这一点,我已将 NumberPicker 的代码复制到我的项目及其依赖项 NumberPickerButton 中。我也复制了支持资源。

我遇到的问题是,当我尝试在布局中包含 NumberPicker 时,Eclipse 中布局的渲染版本不起作用。

<com.spencerandbrown.PatientTracker1.NumberPicker 
android:layout_ 
android:layout_  
android:id="@+id/spanEnd2" />

添加该标签会导致 XML 文件的布局视图仅显示以下错误。

ClassCastException: com.spencerandbrown.PatientTracker1.NumberPickerButton cannot be cast to com.spencerandbrown.PatientTracker1.NumberPickerButton

我尝试了完全限定名称和非限定名称,但没有区别。

奇怪的是控件在运行时工作,它只是不会在 Eclipse 中呈现。

这个问题有解决方案吗?我是不是做错了什么?

如有必要,我可以从我的项目中包含更多代码以进行澄清。

如果我引用内部 Android 小部件,它在 Eclipse 布局视图中可以正常工作,但以这种方式进行交互很笨拙,并且将来可能会中断。

<com.android.internal.widget.NumberPicker
android:layout_
android:layout_ 
android:id="@+id/spanStart"/>

这是来自 Eclipse 的堆栈跟踪。

java.lang.ClassCastException: com.spencerandbrown.PatientTracker1.NumberPickerButton cannot be cast to com.spencerandbrown.PatientTracker1.NumberPickerButton
at com.spencerandbrown.PatientTracker1.NumberPicker.<init>(NumberPicker.java:110)
at com.spencerandbrown.PatientTracker1.NumberPicker.<init>(NumberPicker.java:98)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(Unknown Source)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:198)
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:126)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:620)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:620)
at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
at android.view.LayoutInflater.inflate(LayoutInflater.java:296)
at com.android.layoutlib.bridge.Bridge.computeLayout(Bridge.java:377)
at com.android.ide.eclipse.adt.internal.editors.layout.GraphicalLayoutEditor.computeLayout(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.GraphicalLayoutEditor.recomputeLayout(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.GraphicalLayoutEditor.activated(Unknown Source)
at com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.pageChange(Unknown Source)
at org.eclipse.ui.part.MultiPageEditorPart$2.widgetSelected(MultiPageEditorPart.java:291)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1176)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1200)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1185)
at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1025)
at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:3256)
at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:2045)
at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:323)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1176)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3493)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3112)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2405)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2369)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2221)
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:500)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:493)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:113)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:194)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
at org.eclipse.equinox.launcher.Main.run(Main.java:1311)

【问题讨论】:

【参考方案1】:

如果这类似于http://code.google.com/p/android/issues/detail?id=6894 的错误 (即自定义视图加载另一个自定义视图),那么问题很可能是由于加载自定义视图类的自定义类加载器。

如果您想正确区分在 Eclipse 中运行还是在 Android 中运行,可以使用 View.isInEditMode(仅当您的代码在 eclipse 中运行时返回 true)。

【讨论】:

【参考方案2】:

解决方法:我发现如果我捕获并忽略 ClassCastException,并且显然不要尝试对我试图查找的视图执行任何操作,则不会再出现问题,我可以再次使用布局编辑器:编辑器会很高兴地加载、初始化和绘制有问题的视图,你只是不能转换到它的类。

try 
    picker = (NumberPicker) findViewById(R.id.myPicker);
    picker.blargh();
    // everything else involving picker
 catch (ClassCastException issue6894)   // ignore

【讨论】:

出色的解决方法...效果很好...非常感谢您的分享

以上是关于尝试为 Android 扩展 XML 布局时出现 Eclipse ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章

Android:膨胀布局时出现带有 InvocationTargetException 的 ***Error

为啥在android应用程序中解析xml时出现nullpointerexception?

“解析 XML 文件时出现异常:文件过早结束。”尝试将 svg 导入 Android Studio

在 ListView 中设置页脚布局时出现问题

Android 开发学习进程0.13

Android 开发学习进程0.13