Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Positioning Popup window in Android correctly

I'm stuck with the Popup window positioning. I'm showing my popup window on click of a Button. I want it should be positioned according to space available. Also if my button is at center it should be below the button. Below is my code for this thing. Please let me know where i'm wrong. Thank you.

mBtnPopUp.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
            ListView mListView = (ListView) mPopUpView.findViewById(R.id.pop_up_list_view);
            mListView.setAdapter(mPopupListAdapter);
            Drawable drawable = getResources().getDrawable(android.R.drawable.alert_light_frame);
            mPopupWindow.setBackgroundDrawable(drawable);
            // mPopupWindow.setBackgroundDrawable(new BitmapDrawable());

            showLikeQuickAction(0, 0);
            mPopupWindow.showAsDropDown(mBtnPopUp);
        }
    });

    mPopupWindow.setOutsideTouchable(true);
public void showLikeQuickAction(int xOffset, int yOffset)
{

    int[] location = new int[2];
    mBtnPopUp.getLocationOnScreen(location);

    Rect anchorRect = new Rect(location[0], location[1], location[0] + mBtnPopUp.getWidth(), location[1] + mBtnPopUp.getHeight());

    mBtnPopUp.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

    int rootWidth = mBtnPopUp.getMeasuredWidth();
    int rootHeight = mBtnPopUp.getMeasuredHeight();

    @SuppressWarnings("deprecation")
    int screenWidth = mWindowManager.getDefaultDisplay().getWidth();


    int xPos = screenWidth - rootWidth + xOffset;
    int yPos = anchorRect.top - rootHeight + yOffset;

    if(rootWidth > anchorRect.right - anchorRect.left)
    {
        // right
        xPos = anchorRect.right - rootWidth;
    }
    else
    {
        // left
        xPos = anchorRect.left + 15;
    }

    if(xPos + rootWidth > screenWidth)
        xPos = screenWidth - rootWidth - 20;

    // display on bottom
    if(rootHeight > anchorRect.top)
    {
        yPos = anchorRect.bottom + yOffset;
        // mPopupWindow.setAnimationStyle(R.style.Animations_GrowFromTop);
    }

    mPopupWindow.showAtLocation(mBtnPopUp, Gravity.NO_GRAVITY, xPos, yPos);
}

Thank you..

like image 563
Amrut Avatar asked Apr 29 '13 06:04

Amrut


2 Answers

I know its quiet late, but i hope it will help someone.

LayoutInflater layoutInflater = getLayoutInflater();                
int popupWidth = 500;//ViewGroup.LayoutParams.WRAP_CONTENT;
int popupHeight = ViewGroup.LayoutParams.WRAP_CONTENT;
popupView = layoutInflater.inflate(R.layout.main, null);

PopupWindow attachmentPopup = new PopupWindow(this);
attachmentPopup.setFocusable(true);
attachmentPopup.setWidth(popupWidth);
attachmentPopup.setHeight(popupHeight);         
attachmentPopup.setContentView(popupView);
attachmentPopup.setBackgroundDrawable(new BitmapDrawable());
attachmentPopup.showAsDropDown(v, -5, 0);

It will position your popup window according to the position of your button.

like image 102
Agr1909 Avatar answered Nov 15 '22 00:11

Agr1909


public void downloadBtnSelected(View anchor) {
    final ListPopupWindow lpw = new ListPopupWindow(this);
    String[] data = { ".png", ".pdf", ".jpg", ".jpeg" };
    PopupAdapter pa = new PopupAdapter(data, this);
    lpw.setAdapter(pa);

    //setting up an anchor view
    lpw.setAnchorView(anchor);

    //Setting measure specifications. I'v used this mesure specs to display my
    //ListView as wide as my anchor view is
    lpw.setHeight(android.widget.LinearLayout.LayoutParams.WRAP_CONTENT);
    lpw.setWidth(anchor.getRight() - anchor.getLeft());

    // Background is needed. You can use your own drawable or make a 9patch.
    // I'v used a custom btn drawable. looks nice.
    lpw.setBackgroundDrawable(this.getResources().getDrawable(android.R.drawable.btn_default));

    // Offset between anchor view and popupWindow
    lpw.setVerticalOffset(3); 

    lpw.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // Our action.....
            lpw.dismiss();

        }
    });
    lpw.show();

}

and the button with an onClickListener to call this method:

Button btn = new Button(this);
btn.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        downloadBtnSelected(v);
    }
});

this code let's you to show a popup below btn the popup width will be the same as the button one. if you want to fill the screen width- set width=LinearLayout.MATCH_PARENT popup menu will be displayed below the anchor view if space, and beyond if there is no space below

like image 28
Alex Avatar answered Nov 15 '22 00:11

Alex