5

我实现了一个弹出菜单,点击一个按钮就会显示出来。这是我的 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);

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

4

3 回答 3

5

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

控制是否将弹出窗口通知其窗口外的触摸事件。这仅对可触摸但不可聚焦的弹出窗口有意义,这意味着窗口外的触摸将传递到后面的窗口。默认值为false

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

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

另一方面,click局部变量应该做什么?它设置为true,因此无论何时调用该方法,它总是会强制pw弹出showOverflow,并且以后无缘无故地设置为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);
}

getApplicationContext()如果你在Activity课堂上,应该使用。否则你应该得到Context作为参数。

于 2012-05-14T05:11:40.540 回答
0

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

于 2015-03-13T02:51:19.480 回答
0

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

问题是:

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

你会做什么是初始化popupviewOnCreate

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

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

将此代码放入您的按钮 onclick

  if(popupwindow.isShowing()){
  popup.dismiss() }
  else{
  ShowOverflow()}
于 2021-09-02T14:43:21.757 回答