extend your own PopupWindow window class like this
public class ToolTipWindow extends PopupWindow implements PopupWindow.OnDismissListener {
private long closeDelayTime;
private Handler mHandler;
private OnDismissListener mOnDismissListener;
public ToolTipWindow(Context context) {
super(context);
super.setOnDismissListener(this);
}
public ToolTipWindow(Context context, long closeDelayTime) {
this(context);
this.closeDelayTime = closeDelayTime;
}
@Override
public void setOnDismissListener(OnDismissListener onDismissListener) {
mOnDismissListener = onDismissListener;
}
//override all show or update method of super class that you use tho call onshow
@Override
public void showAtLocation(View parent, int gravity, int x, int y) {
onShow();
super.showAtLocation(parent, gravity, x, y);
}
public void onShow() {
schedule();
}
private void schedule() {
if (closeDelayTime > 0) {
if (mHandler == null) {
mHandler = new Handler();
}
mHandler.removeCallbacks(closeRunnable);
mHandler.postDelayed(closeRunnable, closeDelayTime);
}
}
@Override
public void onDismiss() {
if (mHandler != null) {
mHandler.removeCallbacks(closeRunnable);
}
if (mOnDismissListener != null) {
mOnDismissListener.onDismiss();
}
}
private Runnable closeRunnable = new Runnable() {
@Override
public void run() {
dismiss();
}
};
}
Here I only override showAtLocation method, if you use another PopUpWindow methods to show that, override that method and call onShow() inside it to automatically schedule is called.
Somewhere in code I call mHandler.removeCallbacks(closeRunnable), it is so important to call this because if widow is closed before time passed, it avoid crash.