package net.londatiga.android; | |
import android.content.Context; | |
import android.graphics.Rect; | |
import android.graphics.drawable.BitmapDrawable; | |
import android.graphics.drawable.Drawable; | |
import android.view.Gravity; | |
import android.view.LayoutInflater; | |
import android.view.MotionEvent; | |
import android.view.View; | |
import android.view.WindowManager; | |
import android.view.View.OnTouchListener; | |
import android.view.ViewGroup.LayoutParams; | |
import android.widget.PopupWindow; | |
/** | |
* This class does most of the work of wrapping the {@link PopupWindow} so it's | |
* simpler to use. Edited by Lorensius. W. L. T | |
* | |
* @author qberticus | |
* | |
*/ | |
public class CustomPopupWindow { | |
protected final View anchor; | |
protected final PopupWindow window; | |
private View root; | |
private Drawable background = null; | |
protected final WindowManager windowManager; | |
/** | |
* Create a QuickAction | |
* | |
* @param anchor the view that the QuickAction will be displaying 'from' | |
*/ | |
public CustomPopupWindow(View anchor) { | |
this.anchor = anchor; | |
this.window = new PopupWindow(anchor.getContext()); | |
// when a touch even happens outside of the window | |
// make the window go away | |
window.setTouchInterceptor(new OnTouchListener() { | |
@Override | |
public boolean onTouch(View v, MotionEvent event) { | |
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { | |
CustomPopupWindow.this.window.dismiss(); | |
return true; | |
} | |
return false; | |
} | |
}); | |
windowManager = (WindowManager) anchor.getContext().getSystemService(Context.WINDOW_SERVICE); | |
onCreate(); | |
} | |
/** | |
* Anything you want to have happen when created. Probably should create a | |
* view and setup the event listeners on child views. | |
*/ | |
protected void onCreate() { | |
} | |
/** | |
* In case there is stuff to do right before displaying. | |
*/ | |
protected void onShow() { | |
} | |
protected void preShow() { | |
if (root == null) { | |
throw new IllegalStateException("setContentView was not called with a view to display."); | |
} | |
onShow(); | |
if (background == null) { | |
window.setBackgroundDrawable(new BitmapDrawable()); | |
} else { | |
window.setBackgroundDrawable(background); | |
} | |
// if using PopupWindow#setBackgroundDrawable this is the only values of the | |
// width and hight that make it work | |
// otherwise you need to set the background of the root viewgroup | |
// and set the popupwindow background to an empty BitmapDrawable | |
window.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); | |
window.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); | |
window.setTouchable(true); | |
window.setFocusable(true); | |
window.setOutsideTouchable(true); | |
window.setContentView(root); | |
} | |
public void setBackgroundDrawable(Drawable background) { | |
this.background = background; | |
} | |
/** | |
* Sets the content view. Probably should be called from {@link onCreate} | |
* | |
* @param root the view the popup will display | |
*/ | |
public void setContentView(View root) { | |
this.root = root; | |
window.setContentView(root); | |
} | |
/** | |
* Will inflate and set the view from a resource id | |
* | |
* @param layoutResID | |
*/ | |
public void setContentView(int layoutResID) { | |
LayoutInflater inflator = | |
(LayoutInflater) anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); | |
setContentView(inflator.inflate(layoutResID, null)); | |
} | |
/** | |
* If you want to do anything when {@link dismiss} is called | |
* | |
* @param listener | |
*/ | |
public void setOnDismissListener(PopupWindow.OnDismissListener listener) { | |
window.setOnDismissListener(listener); | |
} | |
/** | |
* Displays like a popdown menu from the anchor view | |
*/ | |
public void showDropDown() { | |
showDropDown(0, 0); | |
} | |
/** | |
* Displays like a popdown menu from the anchor view. | |
* | |
* @param xOffset offset in X direction | |
* @param yOffset offset in Y direction | |
*/ | |
public void showDropDown(int xOffset, int yOffset) { | |
preShow(); | |
window.setAnimationStyle(R.style.Animations_PopDownMenu_Left); | |
window.showAsDropDown(anchor, xOffset, yOffset); | |
} | |
/** | |
* Displays like a QuickAction from the anchor view. | |
*/ | |
public void showLikeQuickAction() { | |
showLikeQuickAction(0, 0); | |
} | |
/** | |
* Displays like a QuickAction from the anchor view. | |
* | |
* @param xOffset offset in the X direction | |
* @param yOffset offset in the Y direction | |
*/ | |
public void showLikeQuickAction(int xOffset, int yOffset) { | |
preShow(); | |
window.setAnimationStyle(R.style.Animations_PopUpMenu_Center); | |
int[] location = new int[2]; | |
anchor.getLocationOnScreen(location); | |
Rect anchorRect = | |
new Rect(location[0], location[1], location[0] + anchor.getWidth(), location[1] | |
+ anchor.getHeight()); | |
root.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); | |
root.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); | |
int rootWidth = root.getMeasuredWidth(); | |
int rootHeight = root.getMeasuredHeight(); | |
int screenWidth = windowManager.getDefaultDisplay().getWidth(); | |
// int screenHeight = windowManager.getDefaultDisplay().getHeight(); | |
int xPos = ((screenWidth - rootWidth) / 2) + xOffset; | |
int yPos = anchorRect.top - rootHeight + yOffset; | |
// display on bottom | |
if (rootHeight > anchorRect.top) { | |
yPos = anchorRect.bottom + yOffset; | |
window.setAnimationStyle(R.style.Animations_PopDownMenu_Center); | |
} | |
window.showAtLocation(anchor, Gravity.NO_GRAVITY, xPos, yPos); | |
} | |
public void dismiss() { | |
window.dismiss(); | |
} | |
} |