您的位置:首页 > 移动开发 > Android开发

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

2016-03-17 10:31 363 查看
多种情况

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

}

然后不报错了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: