popupwindow使用之異常:unable to add window -- token null is not valid


使用popwindow中又碰到一個白痴問題,在此留作紀念,希望對大家有幫助

 

popupwindow之所以叫這個名字,肯定是要從某個地方彈出啦,但是從哪個地方呢?必須是指定一個view嘛

void android.widget.PopupWindow.showAtLocation(View parent, int gravity, int x, int y)

調用這個函數就能顯示popupwindow了,但是有的同學會有幸碰到一個異常,關於這個異常的解釋是unable to add window -- token null is not valid;is your activity running?

 

看起來就有點納悶了,為啥呢?肯定是你showAtLocation第一個參數用不鳥啦,你有可能是在activity之外showAtLocation,或者是在Activity的onCreate()函數里面調用了showAtLocation,多半是后者,由於你的popupwindow要依附於一個activity,而activity的onCreate()還沒執行完,哪來的popup讓你彈出來嘛。

 

因此,你要做的就是讓這個showAtLocation的調用再晚一點,下面網上找個一個解決方案,我把我的代碼直接貼吧,還是代碼可靠,神馬都是bullshit!在activity類中添加handler

	private Handler popupHandler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0:
				popupWindow.showAtLocation(findViewById(R.id.rlShowImage), Gravity.CENTER|Gravity.CENTER, 0, 0);
				popupWindow.update();
				break;
			}
		}
		
	};

 
然后再在onCreate()函數中添加

popupHandler.sendEmptyMessageDelayed(0, 1000);

 也就是增加一個延時的任務而已啦,簡單有效。

 

 

android AlertDialog顯示錯誤 Unable to add window token null is not for an application解決辦法

 

復制代碼
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        findViewById(R.id.button1).setOnClickListener(new Button.OnClickListener() {
            
            public void onClick(View v) {
                new AlertDialog.Builder(getApplicationContext())
                .setTitle(R.string.dialogTitle)
                .setMessage(R.string.dialogMessage)
                .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getApplicationContext(), "你按了確定。", Toast.LENGTH_SHORT).show();
                    }
                }).show();
            }
        });
    }
復制代碼

 

 

報錯:Unable to add window token null is not for an application

  

異常原因:AlertDialog創建語句public AlertDialog.Builder (Context context)中,不能使用getApplicationContext()得到的context,而必須使用Activity,所以解決如下

 

解決辦法:

將 new AlertDialog.Builder(getApplicationContext()) 改為 new AlertDialog.Builder(MainActivity.this)

其中MainActivity 為當前Activity的名稱 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM