原文链接:http://blog.csdn.net/qq_26643421/article/details/50386431
PopupWindow弹窗不消失,但是事件向下传递
设置了PopupWindow的background,点击Back键或者点击弹窗的外部区域,弹窗就会dismiss.
相反,如果不设置PopupWindow的background,那么点击back键和点击弹窗的外部区域,弹窗是不会消失的.
那么,如果我想要一个效果,点击外部区域,弹窗不消失,但是点击事件会向下面的activity传递,比如下面是一个WebView,我想点击里面的链接等.
研究了半天,说是要给Window设置一个Flag,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
看了源码,这个Flag的设置与否是由一个叫mNotTouchModal的字段控制,但是设置该字段的set方法被标记为@hide。
所以要通过反射的方法调用:
/**
* Set whether this window is touch modal or if outside touches will be sent
* to
* other windows behind it.
*
*/
public static void setPopupWindowTouchModal(PopupWindow popupWindow,
boolean touchModal) {
if (null == popupWindow) {
return;
}
Method method;
try {
method = PopupWindow.class.getDeclaredMethod("setTouchModal",
boolean.class);
method.setAccessible(true);
method.invoke(popupWindow, touchModal);
}
catch (Exception e) {
e.printStackTrace();
}
}
然后在程序中:
UIUtils.setPopupWindowTouchModal(popupWindow, false);
该popupWindow外部的事件就可以传递给下面的Activity了。
popupwindow的布局文件
common_media.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:background="@color/colorPrimary"
android:orientation="vertical">
<Button
android:id="@+id/common_media_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="拍 照" />
<Button
android:id="@+id/common_media_record"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="录 音" />
<Button
android:id="@+id/common_media_video"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="视 频" />
</LinearLayout>
封装popupwindow的类
CommonMediaPop.java
package com.depart.deqing.view;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.PopupWindow;
import com.depart.deqing.R;
/**
* Created by yx on 2015/12/21.
*/
public class CommonMediaPop implements View.OnClickListener, View.OnTouchListener {
private Context mContext;
private OnMediaClick mOnMediaClick;
private PopupWindow mPopupWindow;
public CommonMediaPop(Context context) {
this.mContext = context;
}
@Override
public void onClick(View v) {
mPopupWindow.dismiss();
if (mOnMediaClick == null) {
return;
}
switch (v.getId()) {
case R.id.common_media_photo:
mOnMediaClick.onPhotoClick();
break;
case R.id.common_media_record:
mOnMediaClick.onRecordClick();
break;
case R.id.common_media_video:
mOnMediaClick.onVideoClick();
break;
}
}
public void setOnMediaClick(OnMediaClick onMediaClick) {
this.mOnMediaClick = onMediaClick;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (null != mPopupWindow && mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
mPopupWindow = null;
}
return false;
}
public interface OnMediaClick {
public void onPhotoClick();
public void onRecordClick();
public void onVideoClick();
}
/**初始化控件 , 实现控件点击事件*/
private void init(View v) {
View convertView = LayoutInflater.from(mContext).inflate(R.layout.common_media, null);
Button photo = (Button) convertView.findViewById(R.id.common_media_photo);
Button record = (Button) convertView.findViewById(R.id.common_media_record);
Button video = (Button) convertView.findViewById(R.id.common_media_video);
photo.setOnClickListener(this);
record.setOnClickListener(this);
video.setOnClickListener(this);
mPopupWindow = new PopupWindow(convertView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, true);
convertView.setOnTouchListener(this);//触摸事件 , 在其他区域触摸屏幕 , 取消popupwindow.
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());//保证popupwindow响应返回按钮事件.
mPopupWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);//在底部显示popupwindow.
}
public CommonMediaPop showPop(View v) {
if (null != mPopupWindow) {
mPopupWindow.dismiss();
} else {
init(v);
}
return this;
}
public boolean disMissPop() {
boolean isshowing = false;
if (null != mPopupWindow) {
isshowing = mPopupWindow.isShowing();
mPopupWindow.dismiss();
}
return isshowing;
}
}
使用时调用
//activity中 , 只需要一行代码就可以实现调用
new CommonMediaPop(this).showPop(v).setOnMediaClick(this);