昨天纠结了我一天的问题,今天终于有点眉目了,看来做这一行休息是必要的啊。。。今天记录一下似乎这类型的错误已经犯了不少,真是不应该啊。。
这几天在做一个客户端,公司产品的管理从服务器上移置到Android上面来。在开发的时候有这个一个错误一直找不出来:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an appli
这是我在做用TabHost做应用的时候,在子标签里面进行Activty之间的跳转的时候犯的一个错误。大家都知道,在TabHost的子标签里面要很好的实现Activity跳转,而不覆盖TabHost我们需要用到ActivityGroup。即我们的主Activity需要用到ActivityGroup,在跳转的时候,我们就可以用下面这段代码。
// 传递当前点击的轮询信息到下一个Activity
PollingRequestvo pollingRequestvo = listAllvo.get(adapter.position);
Intent intent = new Intent(PollingManagementActivity.this,
PollingInforActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Bundle bundle = new Bundle();
bundle.putSerializable("pollingRequestvo", pollingRequestvo);
intent.putExtras(bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Holder.viewSwitcher.removeAllViews();
View view = getLocalActivityManager().startActivity("polling",
intent).getDecorView();
Holder.viewSwitcher.addView(view);
当然本类PollingManagementActivity是继承了MyTabActivity类,MyTabActivity类也继承了ActivityGroup类并且覆盖了ActivityGroup类的onBackPress方法,如下:
@Override
public void onBackPressed() {
new AlertDialog.Builder(this).setTitle("注意").setMessage("确定要退出手机网管吗?")
.setIcon(android.R.drawable.ic_menu_help)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}).show();
}
这样覆盖的注意是为了更好的管理Activity ,只要是继承了MyTabActivity的类,这个方法都有用,问题出现了,我们看上面的给出的Activity跳转代码,当我们跳转到PollingInforActivyt的时候,直接点击“返回”键 是可以下面运行父类的onBackPress方法的。但是如果点击其它的页签,再点击这个页签问题就出来了,提示:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an appli错误。
在网上找了许多,问题终于找到了。这是因为我们在继承ActivityGroup,覆盖onBackPress方法的时候,用到new AlertDialog.Builder(this)导致出的错。
这是为什么呢。原因是我们跳转到目标Activity的之后,如果这个Activyt还是继承MyTabActivyt的话,new AlertDialog.Builder(this)中这个this也就代表了当前的Activyt,即PollingInforActivyt,但是我们看到,在跳转Activyt的时候,我们的Activity是以View形式贴到Holder.viewSwitcher的,不能自己再添加view(对话框也是由Activyt添加的一个View),必须用PollingManagementActivity,代替this,我们只需要在PollingInforActivity里,用getParent代替this就可以了,这样我们实际这个对话框是由PollingManagementActivity添加的。。。。。