【问题标题】:Issue dismissing popup window问题关闭弹出窗口
【发布时间】:2012-05-14 04:44:15
【问题描述】:

我实现了一个弹出菜单,点击一个按钮就会显示出来。这是我的 onclick 方法。

public void showOverflow(View view) {

    boolean click = true;
    Button action = (Button) findViewById(R.id.btbAction);

    LayoutInflater inflater = (LayoutInflater) main.this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View popupView = inflater.inflate(R.layout.overflow_layout, null);
    final PopupWindow pw = new PopupWindow(popupView,
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    pw.setOutsideTouchable(true);
    if (click) {
        pw.showAsDropDown(action, 0, 0);
        click = false;
    } else {
        pw.dismiss();
        click = true;
    }
}

单击按钮时会显示弹出窗口。现在,问题是当我在弹出窗口之外触摸时,窗口没有被关闭。 我尝试将此属性设置为弹出窗口

pw.setOutsideTouchable(true);

事情保持不变。请帮我解决这个问题

【问题讨论】:

标签: android popup


【解决方案1】:

您应该将setOutsideTouchable 调用的参数更改为truepw.setOutsideTouchable(false);

控制弹出窗口是否会被通知外部的触摸事件 它的窗口。这仅对可触摸的弹出窗口有意义 但不可聚焦,这意味着窗口外的触摸将是 送到后面的窗户。默认为 false

如果弹出窗口正在显示,调用此方法只会生效 下次显示弹出窗口时或通过手动调用其中一个 update() 方法。

参数:touchable true 如果弹出窗口应该接收外部触摸 事件,false 否则

另一方面,click 局部变量应该做什么?设置为true,所以无论何时调用showOverflow方法,都会强制弹出pw,并且无缘无故设置为false 稍后,因为它的生命周期在您离开该方法时结束。

您的代码应如下所示:

private LayoutInflater inflater;
private Button action;
private PopupWindow pw;
private View popupView;
/*
 * (non-Javadoc)
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    popupView = inflater.inflate(R.layout.overflow_layout, null, false);

    action = (Button) findViewById(R.id.action);
    action.setOnClickListener(this);
}

public void showOverflow()
{
    pw = new PopupWindow(getApplicationContext());
    pw.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
    pw.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
    pw.setOutsideTouchable(true);

    pw.setContentView(popupView);
    pw.showAsDropDown(action, 0, 0);
}

如果您在 Activity 类中,则应使用 getApplicationContext()。否则,您应该将Context 作为参数。

【讨论】:

  • 我想要的只是当我在窗口外部单击底层活动时关闭弹出窗口(处于弹出状态)。当弹出窗口处于活动状态时,局部变量 click 设置为 true。因此,当执行另一次点击时,我检查布尔点击是否为假,以便我可以关闭弹出窗口。不知道我做的对不对。
  • 试过 pw.setOutsideTouchable(false);当我触摸外部时,弹出窗口不会消失
  • 请参阅我的更新以使用上下文创建PopupWindowsetOutsideTouchable 方法可以修改,如果你需要你的弹出是可聚焦/可触摸的。在这种情况下,您需要一个触摸拦截器,以便在出现 MotionEvent.ACTION_OUTSIDE 时关闭弹出窗口。
  • LogCat 说什么?您能否也粘贴错误的堆栈跟踪?
  • 您能否通过编辑您的问题来粘贴整个相关输出?这些行无助于跟踪异常的来源。
【解决方案2】:

pw.setOutsideTouchable(true); 更改为pw.setOutsideTouchable(false);

【讨论】:

    【解决方案3】:

    我知道这是一个老问题,但这就是我为解决它所做的工作

    问题是:

    每次调用 showOverFlow() 时都会创建一个新的 popupwindow 实例,这就是为什么在关闭 popupwindow 后会显示另一个弹出窗口

    你要做的是在OnCreate初始化popupview

    然后在showOverFlow()方法中调用popupwindow.showAsDropDown(view)

    最后你可以检查它是否显示在下面的代码中

    把这段代码放在你的按钮上

      if(popupwindow.isShowing()){
      popup.dismiss() }
      else{
      ShowOverflow()}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多