2011-05-19 47 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

相關問題