Как получить реальную высоту и ширину экрана?

DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;

Я использую эти коды для получения высоты и ширины экрана

высота экрана на моем Nexus7 должна быть 1280

но он возвращает 1205...

а моя minSdkVersion - уровень 8

поэтому я не могу использовать этот метод:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screen_width = size.x;
int screen_height = size.y;

теперь, как мне получить правильный размер экрана?

Edit:

if (Build.VERSION.SDK_INT >= 11) {
        Point size = new Point();
        try {
            this.getWindowManager().getDefaultDisplay().getRealSize(size);
            screenWidth = size.x;
            screenHeight = size.y;
        } catch (NoSuchMethodError e) {
            Log.i("error", "it can't work");
        }

    } else {
        DisplayMetrics metrics = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        screenWidth = metrics.widthPixels;
        screenHeight = metrics.heightPixels;
    }

используйте его!

Ответы

Ответ 1

Я думаю, это сработает. Фокус в том, что вы должны использовать:

display.getRealSize(size);

не

display.getSize(size);

Чтобы справиться с проблемой кодирования API 8, выполните следующие действия:

try { 
    display.getRealSize(size);
    height = size.y; 
} catch (NoSuchMethodError e) {
    height = display.getHeight();
}

Только новые API-устройства будут иметь экранные кнопки навигации и, следовательно, нуждаются в новом методе, более старые устройства будут генерировать исключение, но не будут иметь экранную навигацию, поэтому старый метод будет прекрасен.

В случае, если это нужно сказать: просто потому, что у вас минимальный уровень API 8 для вашего проекта не означает, что вы должны скомпилировать его на этом уровне. Я также использую уровень 8 для минимума, но мой проект в основном скомпилирован на уровне 13 (3.2), предоставляя им доступ к множеству новых методов.

Ответ 2

Я написал метод, который будет как можно ближе к API с 10 по 17+. Он должен давать реальную ширину и высоту для API 14+, и он делает то же самое, что и для всего остального.

    Display display = context.getWindowManager().getDefaultDisplay();
    int realWidth;
    int realHeight;

    if (Build.VERSION.SDK_INT >= 17){
        //new pleasant way to get real metrics
        DisplayMetrics realMetrics = new DisplayMetrics();
        display.getRealMetrics(realMetrics);
        realWidth = realMetrics.widthPixels;
        realHeight = realMetrics.heightPixels;

    } else if (Build.VERSION.SDK_INT >= 14) {
        //reflection for this weird in-between time
        try {
            Method mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            realWidth = (Integer) mGetRawW.invoke(display);
            realHeight = (Integer) mGetRawH.invoke(display);
        } catch (Exception e) {
            //this may not be 100% accurate, but it all we've got
            realWidth = display.getWidth();
            realHeight = display.getHeight();
            Log.e("Display Info", "Couldn't use reflection to get the real display metrics.");
        }

    } else {
        //This should be close, as lower API devices should not have window navigation bars
        realWidth = display.getWidth();
        realHeight = display.getHeight();
    }

Ответ 3

Вы можете найти реальные размеры устройства с помощью Display или DisplayMetrics

Использование Дисплея:

private void findRealSize(Activity activity)
{
    Point size = new Point();
    Display display = activity.getWindowManager().getDefaultDisplay();

    if (Build.VERSION.SDK_INT >= 17)
        display.getRealSize(size);
    else
        display.getSize(size);

    int realWidth = size.x;
    int realHeight = size.y;

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
}

Использование DisplayMetrics:

private void findRealSize(Activity activity)
{
    DisplayMetrics displayMetrics = new DisplayMetrics();

    if (Build.VERSION.SDK_INT >= 17)
    {
        activity.getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
    }
    else
    {
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    }

    int realWidth = displayMetrics.widthPixels;
    int realHeight = displayMetrics.heightPixels;

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
}