处理Android6-0中popuoWindow的兼容性

作者 信马归风
2017.06.06 02:07 字数 856 阅读 177评论 1

前记

popupWindow是Android开发中很重要的一个控件。具体的使用方式我就不多提了。但是popupWindow在Android6.0之后是有些许修改的,这些修改导致我在开发中遇到了很大的坑。在此提出来,希望大家能够规避。


变更

在Android6.0之前popupwindow如果设置

popupWindow.setOutsideTouchable(true);  
popupWindow.setFocusable(false)  

那么点击屏幕外部是不会导致popupWindow触发dismiss()事件的。而在Android6.0下则会触发。

问题

一般情况下我们使用popupWindow如下图 popupWindow

点击全部类型弹出搜索框,再次点击关闭搜索框。

  popButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (popupWindow.isShowing()) {
                    popupWindow.dismiss();
                } else {
                    popupWindow.showAsDropDown(popButton);
                }
            }
        });

这部分的代码在Android6.0以下的机子会正常,但是在Android6.0以上会出现,popupWindow弹出后,点击“全部类型”并不能正常关闭popupWindow,而是popupWindow关闭后再次打开。 这是因为再次点击“全部类型”首先会使popupWindow.dismiss()如此导致你在回调中popupWindow.isShowing()判断为false再次打开了popupWindow

解决办法

其实很简单,只要拦截popupWindow的touch事件即可.由我自自己根据情况来处理popupWindow的开关事件

    popupWindow.setTouchInterceptor(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    return true;
                }
                return false;
            }
        });

发表评论

说点什么吧!留下邮箱让我好回复你。 必填项已用*标注