点击外部弹出窗口设置为 false [setOutsideTouchable(false)] 不起作用

问题描述 投票:0回答:4

//创建布局充气器 尝试{

        LayoutInflater inflator = LayoutInflater.from(this);

//创建视图

        final View menuview = inflater.inflate(R.layout.menu,
                (ViewGroup) findViewById(R.layout.dictionarylist));

        Button Menu = (Button) findViewById(R.id.Menu);

        Menu.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {

                final PopupWindow pw = new PopupWindow(menuview);//initialize popupwindow

                pw.showAtLocation(v, Gravity.CENTER, 0, 0);
                pw.update(0, 0, 200, 250);
                pw.setOutsideTouchable(false);//set outside touch to false

//弹出窗口内按钮的 onclick 监听器

                Button b1 = (Button) menuview.findViewById(R.id.btnClose);
                b1.setOnClickListener(new OnClickListener() {

                    // @Override
                    public void onClick(View v) {
                        pw.dismiss();

                    }

                });
                Button b2 = (Button) menuview.findViewById(R.id.btnQuiz);
                b2.setOnClickListener(new OnClickListener() {

                    // @Override
                    public void onClick(View v) {

                    }

                });
                Button b3 = (Button) menuview.findViewById(R.id.btnTopic);
                b3.setOnClickListener(new OnClickListener() {

                    // @Override
                    public void onClick(View v) {

                        InitialTask2 Task1 = new InitialTask2();
                        Task1.execute();

                    }

                });
                Button b4 = (Button) menuview
                        .findViewById(R.id.btnDictionarylist);
                b4.setOnClickListener(new OnClickListener() {

                    // @Override
                    public void onClick(View v) {

                        try{
                        if(getApplication() != null){
                            pw.dismiss();
                        }
                        else{
                        Intent i = new Intent();
                        i.setClass(getBaseContext(), Dictionarylist.class);
                        startActivity(i);
                        }
                        }
                        catch(Exception x){
                            x.getMessage();
                        }

                    }

                });


            }

        });
    } catch (Exception e) {
        e.getMessage();
    }
    }

点击外部的弹出窗口不起作用

pw.setOutsideTouchable(false);
。当单击弹出窗口外部时,它会执行放置在弹出窗口(即父窗口)后面的操作。 enter image description here

android popupwindow layout-inflater
4个回答
9
投票

试试这个:

pw.setTouchable(true);    
pw.setFocusable(false);    
pw.setOutsideTouchable(false);  

当窗口可触摸为

true
、可聚焦为
false
时,
setOutsideTouchable()
有效。

如果

setOutsideTouchable(true)
,触摸弹出窗口外部将关闭,否则弹出窗口外部仍然可以触摸而不关闭。


6
投票

要关闭弹出窗口,只需添加以下代码行

  popupWindow.setBackgroundDrawable(new ColorDrawable());

它对我有用,我确信这就是你想要的。


0
投票

尝试下面的代码。它对我有用

popUp.setOutsideTouchable(false);
popUp.setFocusable(true);
popUp.showAtLocation(this.layout, Gravity.CENTER, 0, 0);

0
投票

如果 setOutsideTouchable 方法在 PopupWindow 中未按预期工作,可能是由于多种因素造成的。以下是一些可能的解决方案和需要检查的事项:

  1. 可触摸区域边界:确保正确定义可触摸区域。可触摸区域定义了拦截弹出窗口之外的触摸事件的位置。使用 setOutsideTouchable 方法和 setTouchable 来正确设置可触摸区域:

    popupWindow.setTouchable(true); popupWindow.setOutsideTouchable(true);

  2. Focusable:确保弹出窗口不可聚焦。如果它是可聚焦的,触摸事件可能不会按预期传播。

    popupWindow.setFocusable(false);

  3. 背景:验证弹出窗口的背景。后台可能正在拦截触摸事件。您可以设置透明背景或使用没有触摸拦截的自定义可绘制对象。

    popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

  4. 外部触摸监听器:如果上述建议不起作用,您可以尝试手动处理弹出窗口之外的触摸事件。在弹出窗口的父视图上设置外部触摸监听器:

    查看parentView = findViewById(R.id.parentView); // 替换为父视图的ID parentView.setOnTouchListener(new View.OnTouchListener() { @覆盖 公共布尔 onTouch(View v, MotionEvent 事件) { // 在这里处理触摸事件 if (popupWindow.isShowing()) { popupWindow.dismiss(); 返回真; } 返回假; } });

  5. 操作顺序:确保在显示弹出窗口之前设置 setTouchable、setOutsideTouchable 和其他属性。

© www.soinside.com 2019 - 2024. All rights reserved.