【发布时间】:2011-09-16 05:00:09
【问题描述】:
不同的重力值如何影响 Android 中的 PopupWindow.showAtLocation()?
我在 PopupWindows showAtLocation 和 Gravity 上找不到好的文档。
【问题讨论】:
标签: android
不同的重力值如何影响 Android 中的 PopupWindow.showAtLocation()?
我在 PopupWindows showAtLocation 和 Gravity 上找不到好的文档。
【问题讨论】:
标签: android
在尝试了几个小时的黑魔法数学来计算中心并尝试使用 Gravity.TOP 对齐视图之后,我发现了一个使用 Gravity.CENTER 的帖子。我在这里收集我的发现,希望它可以减轻其他人的痛苦。
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0);
视图只需要window token,对位置没有其他影响。
重力告诉布局管理器从哪里开始坐标系以及如何处理这些坐标。我找不到文档,但黑客向我展示了:
【讨论】:
您可以通过在showAtLocation 方法中调整Gravity.CENTER 来更改PopupWindow 的重力:
popupWindow.showAtLocation(anyView, Gravity.CENTER, 0, 0);
下面的图片展示了效果:
Gravity.CENTERGravity.TOPGravity.BOTTOMGravity.LEFTGravity.RIGHTGravity.TOP | Gravity.LEFTGravity.TOP | Gravity.RIGHTGravity.BOTTOM | Gravity.LEFTGravity.BOTTOM | Gravity.RIGHT您可以通过更改中的(x,y) 偏移量来进一步定位它
popupWindow.showAtLocation(anyView, gravity, x, y);
例如
popupWindow.showAtLocation(anyView, Gravity.BOTTOM, 0, 300);
这是上述示例的代码。有关更多基本帮助,请参阅 How to make a simple Android popup window。
int gravity = Gravity.CENTER;
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = inflater.inflate(R.layout.popup_window, null);
int width = LinearLayout.LayoutParams.WRAP_CONTENT;
int height = LinearLayout.LayoutParams.WRAP_CONTENT;
boolean focusable = true;
final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
popupView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
popupWindow.dismiss();
return true;
}
});
popupWindow.showAtLocation(anyView, gravity, 0, 0);
showAsDropDown。【讨论】: