Search code examples
androidandroid-activity

getWindowVisibleDisplayFrame() gives different values in Android 2.2, 2.3 (but not 2.3.3)


I've got an Activity which uses

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

to determine the useable screen space and decide where to place images.

Returning to the Activity after I click the hardware "back" button to leave the Activity, the rectangle values are

(0,0,800,480)

However, returning to the Activity after I click the hardware "home" button to leave the Activity, the rectangle values are

(0,38,800,480)

which throws off the display and the image placement.

How can I ensure I get a consistent values when calling

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

no matter how I left the app?

UPDATE: Thanks to @Reno for helping test; it seems to be dependent on Android version than the device.


Solution

  • Welp, if you read the comments in the source, it admits that this method is kind of broken

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

    You will have to ignore the outRect.top value for versions < 2.3.3