2011-10-05 6 views
5

Mam Activity który wykorzystujegetWindowVisibleDisplayFrame() daje różne wartości w Androidzie 2.2, 2.3 (ale nie 2.3.3)

getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle); 

celu określenia powierzchni użytkowej ekranem i zdecydować, gdzie umieścić obrazy.

Wracając do aktywności po kliknięciu sprzętu „do tyłu”, aby opuścić Activity wartości prostokąta są

(0,0,800,480) 

Jednak, wracając do aktywności po kliknięciu przycisku sprzętowego „dom”, aby opuścić Activity wartości prostokąta są

(0,38,800,480) 

który zrzuca wyświetlacz i umieszczenie obrazu.

Jak mogę zapewnić uzyskać spójną wartości podczas wywoływania

getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle); 

nieważne jak wyszedłem z aplikacji?

AKTUALIZACJA: Dzięki @Reno za pomoc w testowaniu; wydaje się być zależne od wersji Androida niż urządzenie.

+0

Chcę pomocy u –

Odpowiedz

4

Welp, jeśli czytasz komentarze w źródle, to przyznaje, że metoda ta jest rodzajem uszkodzony

public void getWindowVisibleDisplayFrame(Rect outRect) { 
    if (mAttachInfo != null) { 
     try { 
      mAttachInfo.mSession.getDisplayFrame(mAttachInfo.mWindow, outRect); 
     } catch (RemoteException e) { 
      return; 
     } 
     // XXX This is really broken, and probably all needs to be done 
     // in the window manager, and we need to know more about whether 
     // we want the area behind or in front of the IME. 
     final Rect insets = mAttachInfo.mVisibleInsets; 
     outRect.left += insets.left; 
     outRect.top += insets.top; 
     outRect.right -= insets.right; 
     outRect.bottom -= insets.bottom; 
     return; 
    } 

Trzeba będzie ignorować wartość outRect.top dla wersji < 2.3.3

+0

Dziękuję. Ponadto +1 dla "Welp" –

+0

Dlaczego warto ignorować outRect.top dla wersji <2.3.3? Widzę niezerowe wartości podczas uruchamiania w wersjach> 2.3.3 (xoom, nexus 7 ...), które uwzględniają górny pasek stanu. Nie mam urządzenia, które działa <2.3.3, ale kiedy uruchamiam emulator, widzę to samo. Po prostu szukam aktualnej wysokości i szerokości użytecznego obszaru, a metoda getWindowVisibleDisplayFrame() wydaje się spójna, ale wygląda na to, że widziałaś coś innego. Dzięki. – SkolVikingsGuy

0

Tak, zrobiłem to:

Rect rectangle = new Rect(); 
    getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle); 
    if(android.os.Build.VERSION.SDK_INT < 9 /* android.os.Build.VERSION_CODES.GINGERBREAD */) { 
     // http://stackoverflow.com/questions/7659652/getwindowvisibledisplayframe-gives-different-values-in-android-2-2-2-3-but-no/7660204#7660204 
     rectangle.top = 0; 
    } 
+0

Nie śledzę dokładnie tego problemu, ale chciałbym użyć metody getWindowVisibleDisplayFrame(), aby uzyskać obszar dostępny dla mojej aplikacji minus wszystkie paski stanu. Teraz nazywam getWindow() getDecorView(). GetWindowVisibleDisplayFrame() dla wszystkich wersji Androida i działa dobrze, z niezerową "górną" wartością, gdy jest pasek stanu na górze. Czy ten kod będzie wiarygodny we wszystkich wersjach Androida? Uwaga: Dzwonię, gdy użytkownik kliknie przycisk. – SkolVikingsGuy

+0

Nie mam pojęcia. –

+0

Wspomniałeś: "AKTUALIZACJA: Dzięki @Reno za pomoc w testowaniu, wydaje się, że zależy to od wersji Androida niż od urządzenia.", Czy możesz mi pomóc i dać znać różnice między wersjami?Jestem po prostu zdenerwowany, że jedna wersja zwróci rozmiar ekranu bez pasków stanu, a jeden zwróci prostokąt z paskiem stanu. Dzięki. – SkolVikingsGuy

0

są chwile, kiedy trzeba znać dokładne wymiary dostępnej przestrzeni na układzie gdy działalność jest onCreate. Po pewnym zastanowieniu opracowałem ten sposób: https://stackoverflow.com/a/16691531/2202013 Nie używa getWindowVisibleDisplayFrame i ma nadzieję, że będzie to w przyszłości.

1

here to link do bezpośredniego uzyskania paska stanu zamiast go obliczyć. Pozwoli to uniknąć dowolnego problemu z getWindowVisibleDisplayFrame, który jest naprawdę niespójny z powodu platform i urządzeń.

Powiązane problemy