Android点击Spinner时出现BadTokenException异常

3

我在点击下拉菜单(弹出式窗口中的)时遇到了问题。

以下是我的弹出式窗口:

public class PopupDialog extends PopupWindow  {

    public PopupDialog() {
        super();
        init();
    }

    public PopupDialog(View contentView, int width, int height) {
        super(contentView, width, height);
        init();
    }

    public PopupDialog(View contentView) {
        super(contentView);
        init();
    }

    private void init() {
        this.setTouchable(true);
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        setBackgroundDrawable(new BitmapDrawable());

        this.setTouchInterceptor(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    PopupDialog.this.dismiss();

                    return true;
                }

                return false;
            }
        });

    }

}

按钮被点击时,弹出层显示。
public void click(View v) {
        LayoutInflater layoutInflater 
         = (LayoutInflater)getBaseContext()
          .getSystemService(LAYOUT_INFLATER_SERVICE);  
        View popupView = layoutInflater.inflate(R.layout.popup, null);  
                 final PopupDialog popupWindow = new PopupDialog(
                   popupView, 
                   LayoutParams.WRAP_CONTENT,  
                         LayoutParams.WRAP_CONTENT);

                 DisplayMetrics metrics = new DisplayMetrics();
                 getWindowManager().getDefaultDisplay().getMetrics(metrics);
                 popupWindow.setHeight(metrics.heightPixels);
                 popupWindow.setWidth(300);

                 popupWindow.showAtLocation(v, Gravity.NO_GRAVITY, v.getLeft()+v.getWidth(), 0);

    }

我遇到了这个异常(BadTokenException)

05-29 16:35:10.627: E/AndroidRuntime(1055): FATAL EXCEPTION: main
05-29 16:35:10.627: E/AndroidRuntime(1055): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@410ad298 is not valid; is your activity running?
05-29 16:35:10.627: E/AndroidRuntime(1055):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:515)
05-29 16:35:10.627: E/AndroidRuntime(1055):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279)
05-29 16:35:10.627: E/AndroidRuntime(1055):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193)
05-29 16:35:10.627: E/AndroidRuntime(1055):     at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118)
05-29 16:35:10.627: E/AndroidRuntime(1055):     at android.view.Window$LocalWindowManager.addView(Window.java:537)
05-29 16:35:10.627: E/AndroidRuntime(1055):     at android.widget.PopupWindow.invokePopup(PopupWindow.java:988)
05-29 16:35:10.627: E/AndroidRuntime(1055):     at and

任何帮助都受欢迎,提前感谢您:)

你尝试过将 LayoutInflater layoutInflater = (LayoutInflater)getBaseContext() .getSystemService(LAYOUT_INFLATER_SERVICE); 更改为 LayoutInflater layoutInflater = (LayoutInflater)v.getContext() .getSystemService(LAYOUT_INFLATER_SERVICE); 后再试吗? - ρяσѕρєя K
当我改为使用LayoutInflater layoutInflater =(LayoutInflater)v.getContext()。getSystemService(LAYOUT_INFLATER_SERVICE)时,遇到了同样的问题。 - Simo
3个回答

9

有一个上下文冲突。尝试在您的XML微调器声明中添加以下内容:android:spinnerMode="dialog"


是的,谢谢。在对话框模式下它运行良好,但我必须在下拉模式下完成它,你有任何想法如何改变以实现这一点吗? - Simo
在我看来,这是不可能的,因为弹出窗口会占据您的活动焦点。 - Mood
我不知道,但考虑到尝试的次数和花费的时间,我相信你说这是不可能的是正确的 :D 非常感谢。 - Simo

0

希望还不算太晚。 我也遇到了同样的问题。之前一切都运行良好。

android:spinnerMode="dialog"

然而,我无法使用PopupWindow实现下拉菜单(无弹出对话框)。我改用alertbuilder成功实现了相同的效果。
你可以参考这个教程: YT链接

0

在这里进行测试,

暂时删除您代码中的这部分内容。

 this.setTouchInterceptor(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    PopupDialog.this.dismiss();

                    return true;
                }

                return false;
            }
        });

并检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接