GetWindowVisibleDisplayFrame () дает разные значения в Android 2.2, 2.3 (но не 2.3.3)

У меня есть действие, которое использует

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

Для определения используемого пространства экрана и определения места размещения изображений.

Возвращаясь к Activity после того, как я нажму кнопку «Назад», чтобы выйти из Activity , значения прямоугольника будут

 (0,0,800,480) 

Однако, возвращаясь к Activity после того, как я нажму кнопку «home» для выхода из Activity , значения прямоугольника будут

 (0,38,800,480) 

Который отбрасывает дисплей и размещение изображения.

Как я могу обеспечить получение согласованных значений при вызове

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

Независимо от того, как я покинул приложение?

ОБНОВЛЕНИЕ: Спасибо @Reno за помощь в тестировании; Он, похоже, зависит от версии Android, чем от устройства.

Welp, если вы читаете комментарии в источнике, он признает, что этот метод

  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; } 

Вам придется игнорировать значение outRect.top для версий <2.3.3

Вот ссылка, чтобы получить строку состояния напрямую, а не вычислять ее. Это позволит избежать любой проблемы с getWindowVisibleDisplayFrame, которая действительно непоследовательна через платформы и устройства.

Итак, я сделал это:

  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; } 

Бывают случаи, когда вам нужно знать точные размеры доступного пространства для макета, когда в onCreate. После некоторого раздумья я разработал этот способ: https://stackoverflow.com/a/16691531/2202013 Он не использует getWindowVisibleDisplayFrame и, надеюсь, будет в будущем доказательством.