首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android弹出窗口关闭

Android弹出窗口关闭
EN

Stack Overflow用户
提问于 2010-06-26 04:30:34
回答 7查看 62.2K关注 0票数 63

当我单击列表活动中的项目时,会显示一个弹出窗口。问题是back键不能关闭它。我尝试在list活动中捕获back键,但它没有注册it...then。我尝试将onkeylistener注册到我传递给弹出窗口的视图中。如下所示:

代码语言:javascript
复制
pop.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            boolean res=false;
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                // do something on back.
                Log.e("keydown","back");
                if (pw.isShowing()) {
                    Log.e("keydown","pw showing");
                    pw.dismiss();
                    res = true;
                }
            } else {
                res = false;
            }
            return res;
        }
    });

传递给弹出窗口,如下所示:

代码语言:javascript
复制
pw = new PopupWindow(
       pop, 
       240, 
       70, 
       true);

但是那个监听器也不会触发。你能帮帮我吗?我没有想法了:)

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-06-26 12:24:19

这是因为弹出窗口不会响应onTouch或onKey事件,除非它的背景为!= null。Check out some code I wrote来帮助解决这一问题。在基本情况下,您可以调用PopupWindow#setBackgroundDrawable(new BitmapDrawable())来强制它按照您期望的方式运行。您不需要自己的onKey侦听器。如果您希望当用户在窗口边界之外单击时它消失,则可能还需要调用PopupWindow#setOutsideTouchable(true)

扩展的深奥答案:

背景不能为空的原因是因为在PopupWindow#preparePopup中发生了什么。如果它检测到background != null,它将创建一个PopupViewContainer实例,并在该实例上调用setBackgroundDrawable,然后将您的内容视图放入其中。PopupViewContainer基本上是一个侦听触摸事件和关闭窗口的KeyEvent.KEYCODE_BACK事件的FrameLayout。如果背景==为空,它不会执行任何操作,而只是使用您的内容视图。您可以扩展您的根ViewGroup,使其以您想要的方式运行,而不是依赖于PopupWindow来处理。

票数 150
EN

Stack Overflow用户

发布于 2011-11-16 14:34:27

按照下面的步骤操作它运行良好:

代码语言:javascript
复制
PopupWindow pw;
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.weight_popup, (ViewGroup)findViewById(R.id.linlay_weight_popup));
pw = new PopupWindow(layout,LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT, true);
pw.setBackgroundDrawable(new BitmapDrawable());
pw.setOutsideTouchable(true);
pw.showAsDropDown(btnSelectWeight);
票数 39
EN

Stack Overflow用户

发布于 2014-08-26 22:31:33

对于新项目,最好使用

代码语言:javascript
复制
popupWindow.setBackgroundDrawable(new ColorDrawable());

而不是

代码语言:javascript
复制
popupWindow.setBackgroundDrawable(new BitmapDrawable());

因为BitmapDrawable已被弃用。而且,在这种情况下,它比ShapeDrawable更好。我注意到当PopupWindow是一个圆角的矩形时,ShapeDrawable会用黑色填充边角。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3121232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档