2012-10-08 18 views
40

Więc mam mały problem, piszę funkcję, która musi wysłać szerokość ekranu do serwera. Mam wszystko do pracy i używam:Czy można bezpiecznie używać .getWidth na Display, mimo że jest przestarzały?

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 

, aby uzyskać szerokość. Jednak .getWidht() funkcja jest przestarzała i mówi u trzeba użyć:

Point size = new Point(); 
display.getSize(size); 

jednak, że funkcja jest dostępnej tylko dla poziomu api 13 lub więcej, a moja minimalna SDK 8. Więc co mogę zrobić? Czy to bezpieczne, jeśli zostanę z getWidth? Po co dodawać nowe funkcje i nie czynić ich kompatybilnymi wstecz?

Odpowiedz

90

Może być to podejście będzie pomocne:

DisplayMetrics displaymetrics = new DisplayMetrics(); 
mContext.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
int screenWidth = displaymetrics.widthPixels; 
int screenHeight = displaymetrics.heightPixels; 
10

Można sprawdzić na poziomie API w czasie wykonywania, i wybrać, które w użyciu, np:

final int version = android.os.Build.VERSION.SDK_INT; 
final int width; 
if (version >= 13) 
{ 
    Point size = new Point(); 
    display.getSize(size); 
    width = size.x; 
} 
else 
{ 
    Display display = getWindowManager().getDefaultDisplay(); 
    width = display.getWidth(); 
} 
+0

hmm brzmi ok, ale czy kradzież jest w porządku, jeśli używam tylko getwidth? – gabrjan

+0

Tak, jeśli nie jest dostępny w starszych wersjach, nie ma opcji. – nmw

+1

można zrobić wystarczająco dobrze z getWidth() w większości przypadków. – slezadav

4

Jeśli chcesz być poprawne, należy użyć tego podejścia>

  int sdk = android.os.Build.VERSION.SDK_INT; 
      if (sdk < android.os.Build.VERSION.RELEASE) { 
       Display display = getWindowManager().getDefaultDisplay(); 
       int width = display.getWidth(); 

      } else { 
       Point size = new Point(); 
       display.getSize(size); 

      } 
+2

Porównujesz int do ciągu (VERSION.RELEASE). – nmw

+3

Jeśli chcesz być poprawny, nie porównasz int do String i nie będziesz przechowywać int w nieostatecznej zmiennej lokalnej, do cholery nie potrzebujesz tej zmiennej, po co przechowywać ją na pierwszym miejscu. ;) Naprawdę chcesz zrobić 'if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.HONEYCOMB_MR2) {' –