package razerdp.basepopup; import android.app.Activity; import android.content.Context; import android.os.Build; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.PopupWindow; /** * Created by 大灯泡 on 2017/1/12. * <p> * 与basePopupWindow强引用(或者说与PopupController强引用) */ public class PopupWindowProxy extends PopupWindow { private final boolean isFixAndroidN = Build.VERSION.SDK_INT == 24; private final boolean isOverAndroidN = Build.VERSION.SDK_INT > 24; private PopupController mController; public PopupWindowProxy(Context context, PopupController mController) { super(context); this.mController = mController; } public PopupWindowProxy(Context context, AttributeSet attrs, PopupController mController) { super(context, attrs); this.mController = mController; } public PopupWindowProxy(Context context, AttributeSet attrs, int defStyleAttr, PopupController mController) { super(context, attrs, defStyleAttr); this.mController = mController; } public PopupWindowProxy(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, PopupController mController) { super(context, attrs, defStyleAttr, defStyleRes); this.mController = mController; } public PopupWindowProxy(PopupController mController) { this.mController = mController; } public PopupWindowProxy(View contentView, PopupController mController) { super(contentView); this.mController = mController; } public PopupWindowProxy(int width, int height, PopupController mController) { super(width, height); this.mController = mController; } public PopupWindowProxy(View contentView, int width, int height, PopupController mController) { super(contentView, width, height); this.mController = mController; } public PopupWindowProxy(View contentView, int width, int height, boolean focusable, PopupController mController) { super(contentView, width, height, focusable); this.mController = mController; } /** * fix showAsDropDown when android api ver is over N * <p> * https://code.google.com/p/android/issues/detail?id=221001 * * @param anchor * @param xoff * @param yoff * @param gravity */ @Override public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) { if (isFixAndroidN && anchor != null) { int[] a = new int[2]; anchor.getLocationInWindow(a); Activity activity = (Activity) anchor.getContext(); super.showAtLocation((activity).getWindow().getDecorView(), Gravity.NO_GRAVITY, 0, a[1] + anchor.getHeight()); } else { if (isOverAndroidN){ setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); } super.showAsDropDown(anchor, xoff, yoff, gravity); } } @Override public void dismiss() { if (mController == null) return; boolean performDismiss = mController.onBeforeDismiss(); if (!performDismiss) return; boolean dismissAtOnce = mController.callDismissAtOnce(); if (dismissAtOnce) { callSuperDismiss(); } } void callSuperDismiss() { super.dismiss(); } }