Android中在onCreate()时弹出popwindow,很多人都有过类似的需求吧,但是直接在onCreate()中调用popwindow的showAtLocation()方法是会报异常的,在activity的oncreate方法中使用popupwindow出现以下错误:
android.view.WindowManager$BadTokenException: Unable to add window —
token null is not valid; is your activity running? 原因是此时activity还没有初始化完毕,网上也有一些解决方法,但一般都是通过延时一小段时间再弹出实现的,代码不够健壮。其实可以通过不断的检测当前activity的状态,一旦初始化完毕立即调用popwindow的showAtLocation()方法显示。详细代码如下:
[java] view plaincopy
- /************************************************************************
- *
- * 该类用来在初始化的时候弹出一个popwindow,用到的而已文件如下,特别要注意的是其中的
- * android:minHeight="1dp" 和android:minWidth="1dp"属性。初始化时弹出popwindow的关键是
- * 要等待整个activity初始化完毕后再调用showAtLocation()方法,否则会出异常。
- * 实现方式就是不停的检测acitvity是否初始化完毕,一旦完毕就调用
- * showAtLocation() 方法显示popwindow。
- *
- * 以下为布局文件:
- * <?xml version="1.0" encoding="utf-8"?>
- * <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- * android:id="@+id/main"
- * android:layout_width="fill_parent"
- * android:layout_height="fill_parent"
- * android:minHeight="1dp"
- * android:minWidth="1dp"
- * android:orientation="vertical" >
- * </LinearLayout>
- *
- * 作者:石兴
- * 完成时间:2012/3/10
- * 版本 :1.0
- *
- ************************************************************************/
- package cn.sd.sx.initpopw;
- import android.app.Activity;
- import android.graphics.Color;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.Gravity;
- import android.view.View;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.LinearLayout;
- import android.widget.PopupWindow;
- import android.widget.TextView;
- import cn.sd.sx.popw.R;
- public class PopWActivity extends Activity {
- private PopupWindow mPopupWindow;
- private Handler mHandler;
- // 检测时间间隔
- private int detchTime = 5;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mHandler = new Handler();
- // 显示popWindow
- showPopWindow();
- }
- private void showPopWindow()
- {
- LinearLayout view = new LinearLayout(this);
- LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.FILL_PARENT);
- TextView txt1 = new TextView(this);
- txt1.setLayoutParams(params);
- txt1.setGravity(Gravity.CENTER);
- txt1.setText("txt1");
- txt1.setBackgroundColor(Color.RED);
- view.addView(txt1);
- mPopupWindow = new PopupWindow(view, 300,300);
- mPopupWindow.setOutsideTouchable(true);
- /*****************以下代码用来循环检测activity是否初始化完毕***************/
- Runnable showPopWindowRunnable = new Runnable() {
- @Override
- public void run() {
- // 得到activity中的根元素
- View view = findViewById(R.id.main);
- // 如何根元素的width和height大于0说明activity已经初始化完毕
- if( view != null && view.getWidth() > 0 && view.getHeight() > 0) {
- // 显示popwindow
- mPopupWindow.showAtLocation(PopWActivity.this.findViewById(R.id.main),
- Gravity.CENTER, 0, 0);
- // 停止检测
- mHandler.removeCallbacks(this);
- } else {
- // 如果activity没有初始化完毕则等待5毫秒再次检测
- mHandler.postDelayed(this, detchTime);
- }
- }
- };
- // 开始检测
- mHandler.post(showPopWindowRunnable);
- /******************以上代码用来循环检测activity是否初始化完毕*************/
- }
- }
转载自:http://blog.csdn.net/sxsboat/article/details/7340759