Unable to add window -- token null is not valid; is your activity running?

来源:互联网 发布:debian 更改ssh端口 编辑:程序博客网 时间:2024/04/29 23:46

在使用PopupWindow时出现的error,这个错误有一句话is your activity running?看到这句话时,立刻想到了是由于PopupWindow依赖的窗口没销毁掉。
PopupWindow的创建方式:

// 获取自定义布局文件activity_popupwindow_left.xml的视图  private void createPop(){ View popupWindow_view =getLayoutInflater().inflate(R.layout.activity_popupwindow_left, null, false);    // 创建PopupWindow实例,200,LayoutParams.MATCH_PARENT分别是宽度和高度        popupWindow = new PopupWindow(popupWindow_view, 200, LayoutParams.MATCH_PARENT, true);    // 设置动画效果        popupWindow.setAnimationStyle(R.style.AnimationFade);       popupWindow.showAtLocation(mBmiValue , Gravity.BOTTOM, 0, 0);//mBmivalue是锚点  } 

所以就立刻想到了在onDestory()方法中调用popupWindow.dismiss(),结果不行。

源码是这样写的(写了部分源码):

public class ChatRoomActivity extends FragmentActivity    private Button mBmiValue;    private PopupWindow popupWindow;    @Override    public void onCreate(Bundle savedInstanceState) {          setContentView(R.layout.activity_chatroom);          mBmiValue = (TextView) findViewById(R.id.tvBmiValue);          //调用上面的创建pop函数          createPop();    }private void createPop(){      View  popupWindow_view=getLayoutInflater().                         inflate(R.layout.activity_popupwindow_left, null, false);   // 创建PopupWindow实例,200,LayoutParams.MATCH_PARENT分别是宽度和高度        popupWindow = new PopupWindow(popupWindow_view, 200, LayoutParams.MATCH_PARENT, true);    // 设置动画效果        popupWindow.setAnimationStyle(R.style.AnimationFade);       popupWindow.showAtLocation(mBmiValue , Gravity.BOTTOM, 0, 0);//mBmivalue是锚点  }     @Override    public void onDestroy() {        popupWindow.dismiss();        super.onDestroy();    } }

这要写运行结果是第一次进入这个ChatRoomActivity 时,popupWindow显示正常,立刻退出,在进入,呵呵,报错了Unable to add window – token null is not valid; is your activity running?,立即在onDestroy()加了 popupWindow.dismiss();认为这样就可以了。

重复进入activity,在立刻退出,结果还是报错,最后在这个http://stackoverflow.com/questions/4187673/problems-creating-a-popup-window-in-android-activity里面找到了解决方法。
为什么会出现这个原因呢?是因为popupWindow显示依赖activity,并且要等activity所有的生命周期方法全部执行完成才能显示。所以修改了代码

public class ChatRoomActivity extends FragmentActivity    private Button mBmiValue;    private PopupWindow popupWindow;    @Override    public void onCreate(Bundle savedInstanceState) {          setContentView(R.layout.activity_chatroom);          mBmiValue = (TextView) findViewById(R.id.tvBmiValue);          mBmiValue.post(new Runnable(){          //调用上面的创建pop函数          createPop();          });        /*  //调用上面的创建pop函数          createPop();        */    }private void createPop(){      View  popupWindow_view=getLayoutInflater().                         inflate(R.layout.activity_popupwindow_left, null, false);   // 创建PopupWindow实例,200,LayoutParams.MATCH_PARENT分别是宽度和高度        popupWindow = new PopupWindow(popupWindow_view, 200, LayoutParams.MATCH_PARENT, true);    // 设置动画效果        popupWindow.setAnimationStyle(R.style.AnimationFade);       popupWindow.showAtLocation(mBmiValue , Gravity.BOTTOM, 0, 0);//mBmivalue是锚点  }     @Override    public void onDestroy() {        popupWindow.dismiss();        super.onDestroy();    } }

加入了 mBmiValue.post(new Runnable(){
//调用上面的创建pop函数
createPop();
});在运行时没有报错了,post()可以延迟到所有生命周期方法执行完后,在显示popupWindow

0 0
原创粉丝点击