18

我已经设置了弹出窗口,但我想将它置于按钮(视图 v)下方,需要单击它才能打开它:

public void showPopup(Context c, View v){
    int[] location = new int[2];
    v.getLocationOnScreen(location);

    ViewGroup base = (ViewGroup) getView().findViewById(R.id.pup_pattern);  
    LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View pupLayout = inflater.inflate(R.layout.linearlayout_popup, base);

    final PopupWindow pup = new PopupWindow(pupLayout, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT);

    int x = location[0] - (int) ((pupLayout.getWidth() - v.getWidth()) / 2 ); // --> pupLayout.getWidth() gives back -2?
    int y = location[1] + v.getHeight() + 10;

    pup.setFocusable(true);
    pup.showAtLocation(v, Gravity.NO_GRAVITY, x, y);
}

有人想采取措施吗?

4

2 回答 2

44

您不会获得尚未在屏幕上绘制的视图的高度或宽度。

pupLayout.getWidth()// 这会给你 0

你需要得到这样的宽度

int width = MeasureSpec.makeMeasureSpec(0, MeasureSpec. UNSPECIFIED);

像这样使用它

View pupLayout = inflater.inflate(R.layout.linearlayout_popup, base);
pupLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

int x = location[0] - (int) ((pupLayout.getMeasuredWidth() - v.getWidth()) / 2 );
于 2013-04-07T12:18:21.133 回答
-4

其他方式:

/**
 * @return Point object which:<br>
 * point.x : contains width<br>
 * point.y : contains height
 */
public static Point getViewSize(View view) {
    Point size = new Point();
    view.post(new Runnable() {
        @Override
        public void run() {
            size.set(view.getMeasuredWidth(), view.getMeasuredHeight());
        }
    });
    return size;
}
于 2019-01-20T13:16:33.670 回答