2010-01-16 2 views
4

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

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

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

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

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

Добавление этого тега приводит к тому, что в представлении Layout 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

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

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

отличная работа вокруг ... он отлично работал ... Большое вам спасибо за обмен – praveenb

3

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

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

Смежные вопросы