Eclipse ClassCastException при попытке расширить макет XML для Android - PullRequest
4 голосов
/ 16 января 2010

Я новичок в разработке java, eclipse и android, поэтому я могу упустить что-то простое, хотя я несколько раз проверил базовые вещи, такие как правописание.

Поскольку в общедоступном Android SDK отсутствует элемент управления сборщиком чисел (например, используемый в средстве выбора даты), принято считать «клонированием и владением» элементом управления, существующим в источнике Android .

В попытке сделать это я скопировал код для NumberPicker в свой проект и его зависимость NumberPickerButton. Я также скопировал вспомогательные ресурсы.

Проблема, с которой я столкнулся, заключается в том, что при попытке включить NumberPicker в макет отображаемая версия макета в Eclipse не работает.

<com.spencerandbrown.PatientTracker1.NumberPicker 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"  
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_width="wrap_content"
android:layout_height="wrap_content" 
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)

Ответы [ 2 ]

3 голосов
/ 10 марта 2010

Если это похоже на ошибку в http://code.google.com/p/android/issues/detail?id=6894 (т. е. пользовательское представление загружает другое пользовательское представление), тогда проблема, вероятно, связана с загрузчиком пользовательских классов, который загружает классы пользовательского представления.

вы можете использовать View.isInEditMode (возвращает true, только когда ваш код выполняется внутри eclipse), если вы хотите правильно различать запуск внутри Eclipse или внутри Android.

2 голосов
/ 28 февраля 2010

Обходной путь: я обнаружил, что если я улавливаю и игнорирую ClassCastException, и, очевидно, затем не пытаюсь что-либо делать с представлением, которое я пытался найти, больше нет проблем, и я снова могу использовать редактор макетов: редактор с удовольствием загрузит, инициализирует и нарисует проблемное представление, которое вы просто не можете привести к его классу.

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