昨天糾結了我一天的問題,今天終於有點眉目了,看來做這一行休息是必要的啊。。。今天記錄一下似乎這類型的錯誤已經犯了不少,真是不應該啊。。
這幾天在做一個用戶端,公司產品的管理從伺服器上移置到Android上面來。在開發的時候有這個一個錯誤一直找不出來:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an appli
這是我在做用TabHost做應用的時候,在子標籤裡面進行Activty之間的跳轉的時候犯的一個錯誤。大家都知道,在TabHost的子標籤裡面要很好的實現Activity跳轉,而不覆蓋TabHost我們需要用到ActivityGroup。即我們的主Activity需要用到ActivityGroup,在跳轉的時候,我們就可以用下面這段代碼。
// 傳遞當前點擊的輪詢資訊到下一個ActivityPollingRequestvo 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方法,如下:
@Overridepublic 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添加的。。。。。