android.view.WindowManager$BadTokenException: Unable to add window — token null is not for an

來源:互聯網
上載者:User

昨天糾結了我一天的問題,今天終於有點眉目了,看來做這一行休息是必要的啊。。。今天記錄一下似乎這類型的錯誤已經犯了不少,真是不應該啊。。

這幾天在做一個用戶端,公司產品的管理從伺服器上移置到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添加的。。。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.