2011-05-19 69 views
28

我有我的应用程序的一些弹出窗口,它的全屏和下面的代码:显示PopupWindow集中

content.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    content.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    int screenWidth = windowManager.getDefaultDisplay().getWidth(); 
    int screenHeight = windowManager.getDefaultDisplay().getHeight(); 
    int x = screenWidth/2 - content.getMeasuredWidth()/2; 
    int y = screenHeight/2 - content.getMeasuredHeight()/2; 
    window.showAtLocation(content, Gravity.NO_GRAVITY, x, y); 

使中心的窗口显示。

但我有另一个不是全屏的活动,当弹出窗口从正确的位置开始时,它是从右到下的。

试图找出为什么发生这种情况,我认为showAtLocation显示它是相对于当前的活动,但我需要显示它相对于显示。

我该怎么做?或者有一个更简单的方法来弹出刚居中的弹出窗口?

回答

84
popupWindow.showAtLocation(anyViewOnlyNeededForWindowToken, Gravity.CENTER, 0, 0); 

这将以您的视角为中心。

我花了2个小时的痛苦才弄明白这一点。我不需要任何黑魔法数学来处理这个问题。

该视图仅用于窗口令牌,它对位置没有其他影响。

重力告诉布局管理器在哪里启动坐标系以及如何处理这些坐标。我找不到文档,但黑客向我显示:

  • CENTER使用弹出窗口的中间对齐到指定的x,y。因此,0,0是屏幕居中
  • BOTTOM使用弹出窗口的底部与指定的x,y对齐。因此,0,0的弹出底部与屏幕底部对齐。如果你想10px填充,然后y = 10(不是-10)将弹出窗口向上移动10个像素。

我写这件事在这里Android PopupWindow.showAtLocation() and effects of Gravity

+0

完美的作品。谢谢 – 2011-09-19 14:18:35

+0

所以,如果我想适应底部,我只是使用这一行'mPw.showAtLocation(v,Gravity.BOTTOM,0,0);'是否可以在xxhpi设备上使用,比如Nexus 5?我有它的问题... – 2014-05-28 00:40:42

+0

你可以告诉日期,这是张贴前xxhpi设备。你的代码应该做你期望的。按照撰写的链接,看到我发布的不同选项的图像示例。 – Bae 2014-05-29 05:36:24

9
 View popupView = layoutInflater.inflate(R.layout.index_popviewxml, 
       null); 


     final PopupWindow popupWindow = new PopupWindow(popupView, 
       LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, true); 



     popupWindow.setTouchable(true); 
     popupWindow.setFocusable(true); 

     popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0); 
+0

这个调用需要API级别19。无论如何,我可以做到19岁以下的API级别? – 2016-05-25 08:29:57