1 问题

需要实现PopupWindow内部可以点击,但是外部点击不会消失

 

 

 

 

 

2 初步解决办法


设置PopupWindow的mFocusable属性mOutsideTouchable属性,我们知道如果我们不想穿透事件,也就是说,不想出现点击Popuowindow外部的文本框或者按钮生效,我们需要获取Popuowindow的焦点,也就是设置
mFocusable值为true

也就是setFocusable( true ),然后我们分析mOutsideTouchable的设置函数解释
/** * <p>Controls whether the pop-up will be informed of touch events outside
* of its window. This only makes sense for pop-ups that are touchable * but not
focusable, which means touches outside of the window will * be delivered to the
window behind. The default is false.</p> * * <p>If the popup is showing,
calling this method will take effect only * the next time the popup is shown or
through a manual call to one of * the {@link #update()} methods.</p> * * @param
touchable true if the popup should receive outside * touch events, false
otherwise * * @see #isOutsideTouchable() * @see #isShowing() * @see #update()
*/ public void setOutsideTouchable(boolean touchable) { mOutsideTouchable =
touchable; }
里面很关键的一句,popuoWindow需要可触摸而且不能聚焦,特么刚才不是说要聚焦popupWindow吗?矛盾了
setFocusable(true) setOutsideTouchable(false)

这样写聚焦了,外部点击会导致PopuoWindow消失,因为setOutsideTouchable没生效,虽然事件不穿透,点击外部消失PopupWindow,依然不是我想要的效果,所以就改成了这样
setFocusable(false) setOutsideTouchable(false)
 

 

 

 

 

 

3 依然存在的问题


按照上面的修改,虽然点击外部PopupWindow不消失了,但是特么可以点击外部的EditView,特么我不想出现这样的效果,希望点击外部没反应,还有其它办法吗?

 

 

 

 

 

 

 

4 分析

既然涉及到了点击,事件分发,我们需要自然而然想到事件分发

既点击外部的PopupWindow的时候,我们让事件不分发进去就行,我们知道

Activity事件分发有2种形式,dispatchTouchEvent 方法onTouchEvent方法

我们这里重写dispatchTouchEvent方法,在出现Popupwindow的时候,返回false就行了,点击无效

 

 

 

 

 

 

5 实现
//为了解决弹出PopupWindow后外部的事件不会分发,既外部的界面不可以点击 @Override public boolean
dispatchTouchEvent(MotionEvent event){ if (popupWindow != null &&
popupWindow.isShowing()){ return false; return super.dispatchTouchEvent(event);
}
 

 

 

 

 

6 总结

只要我们想要实现点击一些东西,我们需要想到Activity的事件分发,让事件不要分下去,也就点击无效了,我们需要自然而然想到
Activity的dispatchTouchEvent和onTouchEvnet方法

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信