Android PopupWindow的封装使用

原文链接: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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值