使用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解決辦法
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的名稱