2012-01-09 92 views
2

請正確地讓我在這裏:安卓:獲取屏幕尺寸爲根佈局僅

我想獲得可用的高度/空間的寬度與活動/佈局onCreate()方法來計算高度可以給予兒童佈局。我可以使用以下屏幕大小:

 root = (LinearLayout) findViewById(R.id.mainroot); // Main layout of LinearLayout 

     android.view.Display display = getWindowManager().getDefaultDisplay(); 
    int height = Display.getHeight(); // I know this is deprecated have hence used 
     int width = Display.getWidth(); // DisplayMetrics 
    int childWidth, childHeight; 

    DisplayMetrics metrics = new DisplayMetrics(); 
    display.getMetrics(metrics); 
    //int density = metrics.densityDpi; 
    height = metrics.heightPixels; //480 
    width = metrics.widthPixels; //320 

這兩種方法/方式都給我相同的高度和寬度,即全屏大小。我正在尋找的是獲得實際的高度,這是在扣除應用標題,狀態欄等之後的佈局。

任何想法如何得到這個。或者獲得標題的大小等 - 這裏應該統計所有的東西。在模擬器上,我看到頂部有2個條 - 1必須是應用程序標題什麼是另一個。我可以獲得所有的高度,並從屏幕高度中扣除。

還有一點:在這種情況下,我將按照程序設置高度,因此它將以像素爲基礎(因爲我只能以像素爲單位設置像素高度)會影響密度因子,屏幕大小不同。什麼可以是一種方式來計算高度(讓說50%)的兒童佈局,將任何密度相同的所以。

回答

2

SOLUTION:

在我的onCreate(),添加以下行:

setContentView(R.layout.mainpage); 

    root = (LinearLayout) findViewById(R.id.mainroot);  
    root.post(new Runnable() { 
     public void run() { 
      Rect rect = new Rect(); 
      Window win = getWindow(); 
      win.getDecorView().getWindowVisibleDisplayFrame(rect); 
      int statusHeight = rect.top; 
      int contentViewTop = win.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
      titleHeight = contentViewTop - statusHeight; 
      Log.i(Utility.TAG, "titleHeight = " + titleHeight + " statusHeight = " + statusHeight + " contentViewTop = " + contentViewTop); 

      // CALCULATE THE SIZE OF INNER LAYOUTS 
      calculateChildSize(); 
     } 
    }); 

與上面的代碼,我得到的標題欄的&狀態條的值。從metrics.heightPixels;扣除它,我得到屏幕所需的高度。

好點是這個代碼適用於所有密度的。

希望這可以幫助其他人。

改進:我必須爲我的應用程序中的所有活動執行類似的計算,因此只考慮編寫一次代碼。我可以將titleHeight保存爲靜態變量,以便在所有活動中使用。 但是

用戶可以在運行時改變手機的密度。 如果是這樣,那麼Activity的onCreate會再次被調用嗎? 如果沒有,那麼我可以捕捉密度變化事件,我可以添加此代碼並使當前活動刷新。

任何想法改進建議,讚賞。

+0

我不認爲用戶可以在運行時更改設備密度,但在3.2中引入了兼容模式後,我不確定這會對它造成怎樣的影響。至於你的測量,如果你真的不需要「狀態欄」和「標題欄」的大小,但只真的需要你的意見的可用大小,那麼你爲什麼不在你的運行()方法:'run(){sRootHeight = root.getHeight(); }'sRootHeight'是一個靜態類變量,所以你的其他活動可以引用它。 – 2012-02-03 02:00:00

+0

@Turbo,我實際上有兩排3個按鈕。基於可用空間,我計算按鈕的高度和寬度,考慮它們之間的空間。我在XML中添加了兩行,每行3個按鈕,root.getHeight();給我的標準尺寸的按鈕。如果屏幕處於portriat模式,則在橫向模式下,高度大於寬度,反之亦然。基於可用的高度,我可以設置按鈕的高度。如果在3.2版中兼容性moe可能會受到一定程度的影響,那麼在更高版本中,它也可能完全可用。你說什麼 ?? – Tvd 2012-02-03 05:53:56

+0

我還沒有玩兼容模式,所以我不太熟悉它的影響。但是使用獲取視圖高度的root.post()方法是非常安全的,因爲無論屏幕大小如何,您都可以在運行時計算所需的空間。如果你擔心兼容模式[這裏是你如何禁用它](http://developer.android.com/guide/practices/screen-compat-mode.html#Disable) – 2012-02-11 09:18:22

0

//其中rootView是應用程序根視圖的對象 final int viewWidt = rootView.getMeasuredWidth();

+0

這給了我「0」,因爲在onCreate佈局不知道它的大小。 – Tvd 2012-01-09 10:57:22

+0

把'rootView.getMeasuredWidth()'放在'void run'裏面。你會得到正確的寬度。 – Arvin 2013-10-16 06:23:50

+0

這個和另一個答案就像「稍後再測量!」一樣。而不是回答如何在創建中獲得它。 – 2016-08-25 07:38:23