android.view.WindowManager$BadTokenException: Unable to add window

来源:互联网 发布:千锋教育java怎么样 编辑:程序博客网 时间:2024/06/16 00:26

多种情况

1、在子线程中打开,应放到主线程中

2、参数为getApplicationContext(),应为activity

3、activity未加载出来就去显示,可以延迟显示:new Handler().postDelayed

4、popup显示写在回调中,如果activity被销毁,回调成功后显示pop,会报这个错误。应判断显示popup的activity是否被销毁




做测试

(模仿网络耗时操作)

public class MNetUtil {
private NetSuccess success;
public MNetUtil(NetSuccess success) {
this.success = success;
}
private Handler mHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
if (success != null) {
success.netSuccess();
}
};
};
public void startNet(){
new Thread(){
public void run() {
for (int i = 0; i < 5; i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
mHandler.sendEmptyMessage(0);
};
}.start();
}


public interface NetSuccess{
public void netSuccess();
}
}



BActivity(随便写一个)

public class BActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
}
}


MainActivity(布局为两个按钮,进来后调用耗时操作,完成耗时操作后执行回调,回调中显示popupwindow)

public class MainActivity extends Activity implements NetSuccess, OnClickListener{
private Button bt_go,bt_show;
private PopupWindow mPop;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
setData();
setListeners();
}


private void setListeners() {
bt_go.setOnClickListener(this);
bt_show.setOnClickListener(this);
}


private void setData() {
MNetUtil netUtil = new MNetUtil(this);
netUtil.startNet();
}


private void initView() {
bt_go = (Button) findViewById(R.id.bt_go);
bt_show = (Button) findViewById(R.id.bt_show);
}


@Override
public void netSuccess() {
sowPop();
}


private void sowPop() {
if (mPop == null) {
mPop = new PopupWindow();
           final TextView view = new TextView(this);
           view.setText("aaaaaaaaaaaaaaaaaaaaaaaaaaa");
           mPop.setContentView(view);
           mPop.setWidth(ScreenUtil.getScreenWidth(this));
           mPop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
           mPop.setFocusable(true);
           mPop.setBackgroundDrawable(new BitmapDrawable());
           mPop.setInputMethodMode(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
           mPop.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
       }


       if (!mPop.isShowing()) {
           mPop.showAsDropDown(bt_show);
       } 
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_go:
Intent intent = new Intent(MainActivity.this, BActivity.class);
startActivity(intent);
finish();
break;
case R.id.bt_show:
sowPop();
break;
}
}

}



进来之后先点击go按钮,调到Bactivity中,等待5秒,回调执行后程序奔溃



然后我们在在显示potwindow的代码前判断

if(isFinishing()){

     //这儿显示popwindow

}


然后不报错了

0 0
原创粉丝点击