2011-06-30 51 views
1

我开发了一个应用程序,其中我有4个选项卡A,B,C,D。每个选项卡都包含一个活动。在第四个选项卡D中,我添加了一个ActivityGroup,其中有3个活动X,Y,Z。在第四个Tab中,我添加了活动组,我得到了StackOverflow错误。请帮我解决这个错误。如何解决android中的BadTokenException错误?

这是我的堆栈跟踪: -

06-30 18:22:26.521: ERROR/AndroidRuntime(1293): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewRoot.setView(ViewRoot.java:468) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.app.Dialog.show(Dialog.java:239) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.app.AlertDialog$Builder.show(AlertDialog.java:802) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.widget.Spinner.performClick(Spinner.java:257) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.View.onTouchEvent(View.java:4179) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.View.dispatchTouchEvent(View.java:3709) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
06-30 18:22:26.521: ERROR/AndroidRuntime(1293):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow 

我这是在构建TABS -------

Resources res = getResources(); 
TabHost tabHost = getTabHost(); // The activity TabHost 
TabHost.TabSpec spec; // Reusable TabSpec for each tabO 
Intent intent; // Reusable Intent for each tab 

// Create an Intent to launch an Activity for the tab (to be reused) 

intent = new Intent().setClass(this,FirstActivity.class); 
spec = tabHost.newTabSpec("tab_First"); 
spec.setIndicator("First",res.getDrawable(R.drawable.ic_tab)); 
spec.setContent(intent);  
tabHost.addTab(spec); 

// 2nd tab 
intent = new Intent().setClass(this,SecondActivity.class); 
spec = tabHost.newTabSpec("tab_Second"); 
spec.setIndicator("Second",res.getDrawable(R.drawable.ic_tab)); 
spec.setContent(intent); 
tabHost.addTab(spec); 

//3rd Tab 
intent = new Intent().setClass(this,ThirdActivity.class); 
spec = tabHost.newTabSpec("tab_Third"); 
spec.setIndicator("Third",res.getDrawable(R.drawable.ic_tab)); 
spec.setContent(intent); 
tabHost.addTab(spec);   

// 4th tab  
intent = new Intent().setClass(this,FourthActivity.class); 
spec = tabHost.newTabSpec("tab_Fourth"); 
spec.setIndicator("Fourth",res.getDrawable(R.drawable.ic_create)); 
spec.setContent(intent); 
tabHost.addTab(spec);   

tabHost.setCurrentTab(0);  
+0

仅提供logcat的消息不会是足够的信息来回答你的问题使用任何其中的活动。显示选项卡的相关代码以及如何构建所有选项卡。 – binnyb

回答

1

我没有看到任何Stackoverflow Error(现在的样子你确定你知道什么是Stackoverflow?)...你的问题是,你试图在已经完成或者不在前台的活动中显示一个对话框。至少,这是我们可以从logcat trace中推断出来的。

+0

事实上,经过一定次数的操作后,它抛出异常。最后一次抛出异常时,我试图点击微调。但我试图找出异常的原因。有时它显示android.view.windowmanager badtokenexception和有时候是StackOverflow异常。 – Prachi

+1

好吧,所以在Java(以及Android)中,当您递归调用方法时,通常会显示StackOverflow异常。例如,这会导致StackOverflow异常:'void name(){name();}'。所以看看你的代码,看看你是否正在做这样的事情。 – Cristian

+0

嗨克里斯蒂安!其实我在第四个标签中遇到了这个问题,我正在浏览一系列的活动。我正在浏览像这样的东西.... FourthActivity-> X和Y.然后从Y-> FourthActivity然后X-> Z,Z-> FourthActivity。我无法理解我究竟在哪里出错,有时甚至在绘制视图时抛出异常。 – Prachi

1

正如@Cristian所提到的,我也可以说你试图在活动内部显示一个对话框或者引用当前活动的上下文,但是当你使用带有Tabs的ActivityGroup的时候,需要使用getParent()来获取父视图的上下文。

当显示对话框,你需要一个父活动的上下文:

// define at Global level and use it inside the activity whenever you want to refer     
    //activity context; 
    private Activity activity; 

    //Write this inside onCreate() method.   
    activity = getParent(); 

现在,每当你应该参考背景,然后用这个活动上下文值。

+0

嗨帕雷什!我试过了,但问题仍然存在。我可以打开对话框,但是在抛出StackOverflowException异常的几次操作之后再次打开对话框。 – Prachi

+0

您正在第四个选项卡中设置FourthActivity.class,它是一个组类还是单个活动类? –

+0

帕雷什它是一个ActivityGroup。 – Prachi

0

这是一个常见错误,可以在对话框中使用'getApplicationContext'而不是'this'修复。另见FATAL EXCEPTION: main。当您(从对话框中)尝试使用启动对话框的活动的上下文时(如果该活动不再位于前景中),将发生该错误。

-1

,你必须创建标签使静态上下文和要创建对话框

相关问题