尝试使用startActivity从另一个类调用自定义弹出窗口时出错

时间:2012-03-15 03:41:41

标签: android

我是android开发的新手,我正在尝试从我的主类打开一个弹出窗口,该窗口是在另一个类上创建的。 问题是,当我尝试通过点击主要类的按钮来调用弹出窗口时,我收到以下错误:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?

如果我将弹出的代码移动到按钮的情况下,我可以通过点击它打开,但我不能使用任何方法在其他类(至少我不知道如何)。 我经常搜索并找到一些类似的线程,但我尝试的所有内容都失败了,错误没有改变。

所以,我更喜欢在第二个类中使用popup的所有代码,只是从主类调用它,但如果我可以访问第二个类的方法,则不会打扰我。

以下是弹出窗口的代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    LayoutInflater inflater = (LayoutInflater) getSystemService     (Context.LAYOUT_INFLATER_SERVICE);
    //Inflate the view from a predefined XML layout
    View layout = inflater.inflate(R.layout.keyboard,
            (ViewGroup) findViewById(R.id.root));
    // create a 300px width and 470px height PopupWindow
    final PopupWindow pw = new PopupWindow(layout, 590, 400, true);
    pw.setAnimationStyle(android.R.style.Animation_Dialog);
    pw.setBackgroundDrawable(new BitmapDrawable());
    pw.setOutsideTouchable(true);
    // display the popup in the center
    pw.showAtLocation(layout, Gravity.TOP, 0, 50);

主类按钮的代码:

case R.id.bkeyb:
        startActivity(new Intent(this, keyboard.class));

     break;

我决定将弹出的所有代码包含在主活动中并删除第二个类。 所以我创建了一个方法弹出窗口,其中包含上面的主类onCreate下的弹出窗口代码。我用按钮测试它,我想打开弹出窗口并工作。 然后我为弹出窗口的所有按钮创建了一个Initialise方法,其中使用findViewById作为资源和onClickListeners定义。

现在弹出的代码变为:

public void Popup(){
    LayoutInflater inflater = (LayoutInflater) getSystemService (Context.LAYOUT_INFLATER_SERVICE);
    //Inflate the view from a predefined XML layout
    View layout = inflater.inflate(R.layout.keyboard,
            (ViewGroup) findViewById(R.id.root));
    initialize();
    // create a 300px width and 470px height PopupWindow
    final PopupWindow pw = new PopupWindow(layout, 590, 400, true);
    pw.setAnimationStyle(android.R.style.Animation_Dialog);
    pw.setBackgroundDrawable(new BitmapDrawable());
    pw.setOutsideTouchable(true);
    // display the popup in the center
    pw.showAtLocation(layout, Gravity.TOP, 0, 50);

}

启动弹出窗口的按钮的onClickListener代码:

    public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()){
    case R.id.bkeyb:
        Popup();

        switch(v.getId()) {
        case R.id.balpha:
            tvcheck.setText("Α");
           Log.e(null, "you pressed a");
        break;
        case R.id.bbeta:
            tvcheck.setText("Β");
        break;  
        }

     break;

我刚刚添加了2个按钮进行测试。

现在按下按钮时,我遇到了 NullPointerException。的崩溃 所以又出了点问题。

2 个答案:

答案 0 :(得分:1)

Android Framework定义了三种窗口类型。应用程序窗口,子窗口,系统窗口。弹出窗口属于子窗口,子窗口必须有父窗口。因此,您无法将弹出窗口设置为活动的主窗口。英文,希望您能理解我的意思!

答案 1 :(得分:0)

问题解决了。 我试图使用主要的onClickListener视图(这是我用于主类的按钮)并在开关盒内的开关中添加弹出按钮。这不起作用。 我需要为我制作的主Popup方法中的每个按钮包含onClickListener视图方法。也许有一种更加清晰和紧凑的方式,但这只对我有用。

工作代码是:

public void Popup(){
    LayoutInflater inflater = (LayoutInflater) getSystemService (Context.LAYOUT_INFLATER_SERVICE);
    //Inflate the view from a predefined XML layout
    View layout = inflater.inflate(R.layout.keyboard,
            (ViewGroup) findViewById(R.id.root));
    // create a 300px width and 470px height PopupWindow
    final PopupWindow pw = new PopupWindow(layout, 590, 400, true);
    pw.update();
    pw.setAnimationStyle(android.R.style.Animation_Dialog);
    pw.setBackgroundDrawable(new BitmapDrawable());
    pw.setOutsideTouchable(true);
    // display the popup in the center
    pw.showAtLocation(layout, Gravity.TOP, 0, 50);
    balpha = (Button) pw.getContentView().findViewById(R.id.balpha);
    balpha.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            tvcheck.append("Α");
        }
    });
    bbeta = (Button) pw.getContentView().findViewById(R.id.bbeta);
    bbeta.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            tvcheck.append("Β");
        }
    });

..........和另外20个按钮相同。

在主onClick视图上只调用Popup()方法:

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()){
    case R.id.bkeyb:
        Popup();
        tvcheck.setText("");        

     break;

.....还有一些按钮案例。