2012-08-28 43 views
1

我通过Acra收到Android应用程序的错误报告。在我的代码中没有提到堆栈跟踪中的行号。我怎么知道问题在于我的代码?任何人都可以帮助我。不理解Android中的java.lang.ClassCastException错误

堆栈跟踪:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.itse.htsurvey/com.itse.htsurvey.Question2Page2Activity}: java.lang.ClassCastException: android.widget.CompoundButton$SavedState cannot be cast to android.widget.AbsSpinner$SavedState 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3188) 
     at android.app.ActivityThread.access$600(ActivityThread.java:122) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1028) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:132) 
     at android.app.ActivityThread.main(ActivityThread.java:4123) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:491) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassCastException: android.widget.CompoundButton$SavedState cannot be cast to android.widget.AbsSpinner$SavedState 
     at android.widget.AbsSpinner.onRestoreInstanceState(AbsSpinner.java:421) 
     at android.view.View.dispatchRestoreInstanceState(View.java:8316) 
     at android.view.ViewGroup.dispatchThawSelfOnly(ViewGroup.java:2038) 
     at android.widget.AdapterView.dispatchRestoreInstanceState(AdapterView.java:766) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.View.restoreHierarchyState(View.java:8295) 
     at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1489) 
     at android.app.Activity.onRestoreInstanceState(Activity.java:898) 
     at android.app.Activity.performRestoreInstanceState(Activity.java:870) 
     at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1099) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1793) 
     ... 12 more 
java.lang.ClassCastException: android.widget.CompoundButton$SavedState cannot be cast to android.widget.AbsSpinner$SavedState 
     at android.widget.AbsSpinner.onRestoreInstanceState(AbsSpinner.java:421) 
     at android.view.View.dispatchRestoreInstanceState(View.java:8316) 
     at android.view.ViewGroup.dispatchThawSelfOnly(ViewGroup.java:2038) 
     at android.widget.AdapterView.dispatchRestoreInstanceState(AdapterView.java:766) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2024) 
     at android.view.View.restoreHierarchyState(View.java:8295) 
     at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1489) 
     at android.app.Activity.onRestoreInstanceState(Activity.java:898) 
     at android.app.Activity.performRestoreInstanceState(Activity.java:870) 
     at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1099) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1793) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3188) 
     at android.app.ActivityThread.access$600(ActivityThread.java:122) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1028) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:132) 
     at android.app.ActivityThread.main(ActivityThread.java:4123) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:491) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
     at dalvik.system.NativeStart.main(Native Method) 

我的代码com.itse.htsurvey.Question2Page2Activity:http://pastebin.com/gPYyZ0GH

编辑1:一些详细信息 - 我想这可能是因为一个部件编号冲突。 savedState部分表明这发生在一个活动休闲之后?这个布局由动态添加的视图/布局组成,它们在运行时被赋予了id。

编辑2:只是为了确认在所做的测试中,这是我第一次收到这个错误。我一直无法重现它。

编辑3:当我改变设备的方向时,我能够重现错误。我如何解决这个问题?

回答

3

读完onSaveInstanceState和onRestoreInstanceState后。我添加了下面的代码。我已经保存了所有视图的状态,所以不需要onSaveInstanceState和onRestoreInstanceStat的默认实现。

@Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     saveEnteredData(); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 

    } 
0

看起来像不能将复合按钮投射到微调器。您只能将复合按钮用作CheckBox,RadioButton,Switch,ToggleButton,但不能使用Spinner。

0

您正在尝试使用

android.widget.CompoundButton $ SavedState

对象,而不是

android.widget.AbsSpinner $ SavedState。

只要尝试检查导入的类是否有正确导入适当的类。

+0

+1的思维过程,但我还是不明白,因为他甚至没有在所有 –

+0

我使用自定义的微调实现使用AbsSpinner – Rynardt

2

令人困惑的一件事是,在代码中,它看起来像是通过其原始ID int引用视图。我其实并不完全确定你的代码是干什么的,但是......这可能会让你感觉很混乱,导致Android发现错误的视图(也许这就是为什么你会收到关于某些你甚至没有使用的视图的错误的错误,像AbsSpinner一样)。例如,代码使用:

CheckBox cb1 = (CheckBox) ll2_8.getChildAt(i).findViewById(R.id.tl1).findViewById(R.id.tr1).findViewById(i); 

所以与其做这样的事情,你的最后一个“findViewById(I)”应该是指由基准产生像你曾与“findViewById做了什么(R.id .tr1)”。

验证,在您的Eclipse的“gen”文件夹中删除R.java,清理项目,构建项目并查看是否可以重现错误。你的应用程序应该(?)崩溃

+1

我给ID的在运行时的观点,因为我动态膨胀意见在运行期间。在运行时访问动态创建的视图的唯一方法是在运行时分配一个id? – Rynardt

+0

嗯...没关系。好吧,它可能无法解决你的问题,但还有另一种方法来做到这一点。如果你只是在一个ArrayList或其他容器中保留对视图的引用,那可能会使事情变得更安全。 –

+0

ArrayList checkBoxes = new ArrayList ();对于(int i = 0; i <10; i ++) public void initPage(){ checkBoxes.add } //现在你可以参考你班上任何地方的任何复选框...... } –

相关问题