2011-12-31 101 views
8

有沒有一種方法可以確定沒有硬菜單按鈕的設備的菜單欄的尺寸(寬度)? (如拱門設備)。軟按鈕欄的尺寸

我需要知道屏幕的有效尺寸...

回答

0

開始的Andorid 3.2,系統狀態欄的高度不包括在DisplayMetrics的身高,你必須使用無證的API(Display.getRawWidth()和Display.getRawHeight())來獲取物理屏幕的寬度或高度。

Method mGetRawW = Display.class.getMethod("getRawWidth"); 
Method mGetRawH = Display.class.getMethod("getRawHeight"); 

int nW = (Integer)mGetRawW.invoke(dp); 
int nH = (Integer)mGetRawH.invoke(dp); 

更新:對於API 13-16,你必須使用上面的代碼來獲得真正的寬度/高度。對於API 17+,您現在可以使用新的公共API,Display.getRealSize()

+0

什麼是dp in(Integer)mGetRawW.invoke(dp);它將返回包含軟菜單的高度。 – Herry 2015-08-12 14:11:32

+0

它給了我一個NoSuchMethodException異常。 – DevAndroid 2015-11-19 09:09:39

+0

什麼是dp?也找不到這兩種方法(NoSuchMethod異常) – Alqueraf 2016-04-05 16:00:22

12

此方法對於在Android KitKat(4.4)中設置佈局填充非常有用。使用此功能,您可以避免軟按鈕欄與佈局重疊。

getRealMetrics方法僅適用於API 17和+,但我只使用以下的方法對我的設備上寫API 19+

@SuppressLint("NewApi") 
private int getSoftbuttonsbarHeight() { 
    // getRealMetrics is only available with API 17 and + 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int usableHeight = metrics.heightPixels; 
     getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 
     int realHeight = metrics.heightPixels; 
     if (realHeight > usableHeight) 
      return realHeight - usableHeight; 
     else 
      return 0; 
    } 
    return 0; 
} 

測試後的Nexus 5 &的Nexus 7 2013

+0

看來,錯誤的結果被返回爲橫向屏幕模式 – Sergii 2015-02-01 22:53:12

+0

我沒有任何問題與橫向模式。您的方法是否在輪換更改時再次調用? – chteuchteu 2015-02-02 12:36:38

+2

不,我的意思是在某些情況下,你需要檢查寬度的差異,但不是高度。當軟鍵位於風景模式旋轉屏幕的右側時? – Sergii 2015-02-02 21:17:22

2

對於遇到此問題的人來說,這是一個非常晚的答案。獲取大量可用空間以抵消任何軟鍵/導航欄甚至狀態欄的簡單方法是使用Apps DecorView中的getWindowVisibleDisplayFrame(Rect)。這將加載一個Rect對象,其中包含實際可用的顯示尺寸。

由於您無法直接獲取對Activiy的DecorView的引用,因此您需要先使用訪問器方法getWindow()獲取Activity的窗口。這將返回包含Activity和其他屏幕元素的窗口對象。要獲取包含活動的decorView以及屏幕裝飾,即狀態欄,導航欄/軟按鈕欄,調用訪問器方法getDecorView()。一旦你有一個DecorView調用getWindowVisibleDisplayFrame(Rect)的引用,並且你將有一個加載的Rect對象。