在Android中正确定位弹出窗口

Amr*_*rut 6 android android-widget android-intent android-layout

我坚持使用弹出窗口定位。我在单击按钮时显示我的弹出窗口。我希望它应该根据可用空间定位。此外,如果我的按钮在中心,它应该在按钮下方。下面是我的代码。请让我知道我错在哪里。谢谢你。

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);
}
Run Code Online (Sandbox Code Playgroud)

谢谢..

Ale*_*lex 3

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();

}
Run Code Online (Sandbox Code Playgroud)

以及带有 onClickListener 的按钮来调用此方法:

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

    @Override
    public void onClick(View v) {
        downloadBtnSelected(v);
    }
});
Run Code Online (Sandbox Code Playgroud)

此代码可让您在 btn 下方显示一个弹出窗口,弹出窗口的宽度将与按钮的宽度相同。如果你想填充屏幕宽度 - 设置 width=LinearLayout.MATCH_PARENT 弹出菜单将显示在锚视图下方(如果有空间),如果下面没有空间则显示在锚视图之外