【问题标题】:dismiss popup when options menu is pressed按下选项菜单时关闭弹出窗口
【发布时间】:2012-08-14 17:49:19
【问题描述】:

我实现了一个弹出窗口,当我按下硬件菜单键时它会出现。现在我想在我再次按下菜单键时关闭弹出窗口。

我试过了

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_MENU) {
        if (pw.isShowing()) {
            pw.dismiss();
        } else {
            openpopup();
        }
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

这是打开弹窗的方法

public void openpop() {
    View view1 = getCurrentFocus();
    showpopup(view1);
}

这里是 showpopup 方法

public void showpopup(View view) {

    pw.setTouchable(true);
    pw.setFocusable(true);
    pw.setTouchInterceptor(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                pw.dismiss();

                return true;
            }

            return false;
        }
    });

    try {
        pw.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
        pw.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
        pw.setOutsideTouchable(false);
        pw.setContentView(popupView);
        pw.showAsDropDown(view, 0, 0);
        popUpShowed = true;
    } catch (Exception e) {
        Log.e("SAMPLE", "Exception", e);
    }

}

但是当我按下菜单时弹出窗口并没有消失。

可能是什么问题?我需要以某种方式完成这项工作。请帮帮我。

【问题讨论】:

  • 我确信您的弹出窗口已显示并立即消失。您能否将一条日志消息放入每个侦听器中? (Log.i("TEST","POPUP")) 并告诉我它的作用。
  • 我在每个听众中都这样做了。当我按下菜单按钮并显示弹出窗口时,会出现日志。显示弹出窗口后,当我再次按菜单关闭弹出窗口时,什么也没有发生并且日志没有注册。

标签: android popup android-menu


【解决方案1】:

显然,第二次按菜单键不会触发。
找到here the solution.
希望对您有所帮助。

编辑:
检查并创建了另一种方法。应该这样做:

boolean open = false;
boolean itemSelected = false;

@Override
public boolean onMenuOpened(int featureId, Menu menu) {

    if(!open || itemSelected) {
        showPopup();
        open = true;
        itemSelected = false;
    }
    return false;
}

@Override
public void onPanelClosed(int featureId, Menu menu) {
    if (open && !itemSelected) {
        closePopup();
        open = false;
    }
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
    itemSelected = true;
    return false;
}

适用于 Android 4.0.3。显然onPrepareOptionsMenu 在 v3 之后改变了功能。

【讨论】:

  • 这就是问题所在。第二次按下菜单键不会触发。我试过了,但问题仍然存在。我怀疑我是否理解错了。能否请您澄清一下方法
【解决方案2】:

你为什么不这样做?

private boolean popUpShowed = false;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_MENU) {
        if (popUpShowed) {
            pw.dismiss();
            popUpShowed = false;
        } else if(!popUpShowed){
            openpopup();
            popUpShowed = true;
        }
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

并删除弹出窗口中的 keyListener。

【讨论】:

  • 试过了,还是不行。我将编辑问题以显示我用来显示弹出窗口的方法。
【解决方案3】:

试试这个:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

if (keyCode == KeyEvent.KEYCODE_MENU) { 
    if (pw.isShowing()) { 
        closePW(); 
    } else { 
        openpopup(); // <- I think you do this already here
    } 
    return true; 
} 

return super.onKeyDown(keyCode, event); 
} 
}

// Put this function in the class which open the popup
// like your function openpopup()
public void closePW(){
   pw.dismiss();
}

【讨论】:

  • 试过但不幸的是它不起作用。我已经编辑了问题,请看一下我用来显示弹出窗口的方法。
  • 嗯,我唯一的想法是用你的 booelan popUpShowed 替换 pw.isShowing 就像在 alexis 答案中一样,或者创建一个函数 public boolean isPopUpShowed(){return popUpShowed;}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
相关资源
最近更新 更多