PopupWindow B 显示在 PopupWindow A 中,B的锚点是A中的一个Widget,报异常为:08-01 06:18:18.214: ERROR/AndroidRuntime(888): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRoot$W@44ef1b68 is not valid; is your activity running?麻烦各位大侠们帮我看看咯,谢谢。

解决方案 »

  1.   

    widget不能弹出popupWindow的吧,只能show一个主题为dialog的activity
    原因应该是widget只是一个view,它需要有host宿主
      

  2.   

    我看了下源代码,PopupWindow是在当前到WindowManager下add了一个View,但两个PopupWindow都是使用同一个Context下创建的呢。
    测试代码public class TestActivity extends Activity {
    private PopupWindow mPop1;
    private PopupWindow mPop2; @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button btnOpen = (Button) findViewById(R.id.btnOpen);
    LayoutInflater inflater = getLayoutInflater();

    View content1 = inflater.inflate(R.layout.popup,null);
    View content2 = inflater.inflate(R.layout.popup,null);

    //PopupWindow里面到按钮
    final Button btn1 = (Button) content1.findViewById(R.id.button1);
    btn1.setOnClickListener(new OnClickListener() { @Override
    public void onClick(View v) {
    //如果第一个参数为btn1就报错,为btnOpen就不会,但是,要求是使用btn1
    mPop2.showAsDropDown(btn1, 20, 40);
    }

    }); mPop1 = new PopupWindow(content1, 200 , 200);
    mPop2 = new PopupWindow(content2, 300, 400);

    btnOpen.setOnClickListener(new OnClickListener() { @Override
    public void onClick(View v) {
    Toast.makeText(getApplicationContext(), "dd",
    Toast.LENGTH_SHORT).show();
    mPop1.showAsDropDown(btnOpen, 0, 0);
    }
    }); }
    }
      

  3.   

    时间有限,现在没看你代码。不过推测问题存在:你在一个activity里或者是在一个view里弹出一个窗口,popupwindow,这个popupwindow相当于是一个模态的对话框,此时后面的view或者activity是锁定状态的。只有popupwindow销毁以后才能执行其所属的view或者activity的代码。要在一个popupwindow上创建另一个popupwindow才可以。比如你在一个popupwindow上加载一个view,在这个view的ondraw函数中画一个矩形,然后在点击矩形区域的消息响应函数中new另外一个popupwindow。这样可以实现。