Как определить размер экрана категории устройства (маленький, нормальный, большой, большой), используя код?


308

Есть ли способ определить категорию размера экрана текущего устройства, например маленький, нормальный, большой, большой?

Не плотность, а размер экрана.

Ответы:


420

Вы можете использовать Configuration.screenLayoutбитовую маску.

Пример:

if ((getResources().getConfiguration().screenLayout & 
    Configuration.SCREENLAYOUT_SIZE_MASK) == 
        Configuration.SCREENLAYOUT_SIZE_LARGE) {
    // on a large screen device ...

}

31
Чтобы получить определение x-large, убедитесь, что вы используете target android-3.0 в своем проекте. Или используйте статическое значение 4 для x-large.
Peterdk

5
Некоторые устройства могут иметь НЕОПРЕДЕЛЕННЫЙ размер экрана, поэтому может быть полезно также проверить с помощью Configuration.SCREENLAYOUT_SIZE_UNDEFINED.
valerybodak

Не могли бы вы использовать> =, чтобы получить большие или большие экраны?
Андрей С

150

Код ниже уточняет ответ выше, отображая размер экрана в виде тоста.

//Determine screen size
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
    Toast.makeText(this, "Large screen", Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
    Toast.makeText(this, "Normal sized screen", Toast.LENGTH_LONG).show();
}
else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
    Toast.makeText(this, "Small sized screen", Toast.LENGTH_LONG).show();
}
else {
    Toast.makeText(this, "Screen size is neither large, normal or small", Toast.LENGTH_LONG).show();
}

Этот код ниже отображает плотность экрана в виде тоста.

//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;

if (density == DisplayMetrics.DENSITY_HIGH) {
    Toast.makeText(this, "DENSITY_HIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_MEDIUM) {
    Toast.makeText(this, "DENSITY_MEDIUM... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_LOW) {
    Toast.makeText(this, "DENSITY_LOW... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else {
    Toast.makeText(this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}

Тост хорош для дэвинга.
MinceMan

кто-то может подтвердить очень большой?
Натан Х

68

Ответ Джеффа Гилфельта как статического вспомогательного метода:

private static String getSizeName(Context context) {
    int screenLayout = context.getResources().getConfiguration().screenLayout;
    screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;

    switch (screenLayout) {
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        return "small";
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        return "normal";
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        return "large";
    case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
        return "xlarge";
    default:
        return "undefined";
    }
}

12
private String getDeviceDensity() {
    int density = mContext.getResources().getDisplayMetrics().densityDpi;
    switch (density)
    {
        case DisplayMetrics.DENSITY_MEDIUM:
            return "MDPI";
        case DisplayMetrics.DENSITY_HIGH:
            return "HDPI";
        case DisplayMetrics.DENSITY_LOW:
            return "LDPI";
        case DisplayMetrics.DENSITY_XHIGH:
            return "XHDPI";
        case DisplayMetrics.DENSITY_TV:
            return "TV";
        case DisplayMetrics.DENSITY_XXHIGH:
            return "XXHDPI";
        case DisplayMetrics.DENSITY_XXXHIGH:
            return "XXXHDPI";
        default:
            return "Unknown";
    }
}

1
Это получает плотность экрана. В вопросе уточняется «Не плотность, а размер экрана».
Субару Таширо

11

Спасибо за ответы выше, это мне очень помогло :-) Но для тех (как я), вынужденных по-прежнему поддерживать Android 1.5, мы можем использовать Java-отражение для обратной совместимости:

Configuration conf = getResources().getConfiguration();
int screenLayout = 1; // application default behavior
try {
    Field field = conf.getClass().getDeclaredField("screenLayout");
    screenLayout = field.getInt(conf);
} catch (Exception e) {
    // NoSuchFieldException or related stuff
}
// Configuration.SCREENLAYOUT_SIZE_MASK == 15
int screenType = screenLayout & 15;
// Configuration.SCREENLAYOUT_SIZE_SMALL == 1
// Configuration.SCREENLAYOUT_SIZE_NORMAL == 2
// Configuration.SCREENLAYOUT_SIZE_LARGE == 3
// Configuration.SCREENLAYOUT_SIZE_XLARGE == 4
if (screenType == 1) {
    ...
} else if (screenType == 2) {
    ...
} else if (screenType == 3) {
    ...
} else if (screenType == 4) {
    ...
} else { // undefined
    ...
}

2
Вы можете настроить таргетинг на последнюю версию платформы и ссылаться на константы из Configurationкласса. Это статические конечные значения, которые будут встроены во время компиляции (то есть они будут заменены их действительными значениями), поэтому ваш код не будет работать на более старых версиях платформы.
Каракури

Хорошо, что я этого не знал ... Вы говорите об Android: targetSdkVersion?
А. Массон

1
Да, именно так вы бы нацелились на конкретную версию Большинство людей (по крайней мере, что я видел) установили их targetSdkVersionк последнему выпуску.
Каракури

9

Если вы хотите легко узнать плотность экрана и размер устройства Android, вы можете использовать это бесплатное приложение (разрешение не требуется): https://market.android.com/details?id=com.jotabout.screeninfo


3
Этот вопрос не о конкретном устройстве, а о программировании для нескольких профилей устройств (что является важным процессом разработки программного обеспечения при разработке для мобильных платформ).
mtmurdock

1
хорошее приложение, которое нужно знать, доступно на рынке - также было бы неплохо увидеть код, который приложение использует для получения информации
Stan Kurdziel

4
@StanKurdziel Исходный код опубликован под лицензией MIT с открытым исходным кодом и доступен по адресу: github.com/mportuesisf/ScreenInfo
mmathieum

Эта ссылка мертва
Вадим Котов

5

Нужно проверить наличие больших экранов и высоких плотностей? Это измененный код из выбранного ответа.

//Determine screen size
if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {     
    Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {     
    Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {     
    Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show();
} else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {     
    Toast.makeText(this, "XLarge sized screen" , Toast.LENGTH_LONG).show();
} else {
    Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}

//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;

if (density==DisplayMetrics.DENSITY_HIGH) {
    Toast.makeText(this, "DENSITY_HIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_MEDIUM) {
    Toast.makeText(this, "DENSITY_MEDIUM... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_LOW) {
    Toast.makeText(this, "DENSITY_LOW... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XHIGH) {
    Toast.makeText(this, "DENSITY_XHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXHIGH) {
    Toast.makeText(this, "DENSITY_XXHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXXHIGH) {
    Toast.makeText(this, "DENSITY_XXXHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else {
    Toast.makeText(this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
}

[Плотность] В этом случае вам нужно быть в деятельности. Если вы находитесь снаружи, используйте getWindowManager () этот код WindowManager windowManager = (WindowManager) context .getSystemService (Context.WINDOW_SERVICE);
Хоркавна

3

Вот версия Xamarin.Android ответа Тома Макфарлина

        //Determine screen size
        if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeLarge) {
            Toast.MakeText (this, "Large screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeNormal) {
            Toast.MakeText (this, "Normal screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeSmall) {
            Toast.MakeText (this, "Small screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeXlarge) {
            Toast.MakeText (this, "XLarge screen", ToastLength.Short).Show ();
        } else {
            Toast.MakeText (this, "Screen size is neither large, normal or small", ToastLength.Short).Show ();
        }
        //Determine density
        DisplayMetrics metrics = new DisplayMetrics();
        WindowManager.DefaultDisplay.GetMetrics (metrics);
        var density = metrics.DensityDpi;
        if (density == DisplayMetricsDensity.High) {
            Toast.MakeText (this, "DENSITY_HIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Medium) {
            Toast.MakeText (this, "DENSITY_MEDIUM... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Low) {
            Toast.MakeText (this, "DENSITY_LOW... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xhigh) {
            Toast.MakeText (this, "DENSITY_XHIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xxhigh) {
            Toast.MakeText (this, "DENSITY_XXHIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xxxhigh) {
            Toast.MakeText (this, "DENSITY_XXXHIGH... Density is " + density, ToastLength.Long).Show ();
        } else {
            Toast.MakeText (this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + density, ToastLength.Long).Show ();
        }

2
Пожалуйста, не просто напишите код, а объясните, что вы сделали и как это помогает
Дэвид Меденжак,

2

Попробуйте эту функцию isLayoutSizeAtLeast (int screenSize)

Чтобы проверить маленький экран, по крайней мере 320x426 dp и выше getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_SMALL);

Чтобы проверить обычный экран, по крайней мере, 320x470 точек на дюйм и выше getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_NORMAL);

Чтобы проверить большой экран, по крайней мере, 480x640 точек на дюйм и выше getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_LARGE);

Чтобы проверить очень большой экран, по крайней мере 720x960 точек на дюйм и выше getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_XLARGE);


Ницца! Этот метод доступен уже на уровне API 11!
Enselic

2

В 2018 году, если вам нужен ответ Джеффа в Котлине, вот он:

  private fun determineScreenSize(): String {
    // Thanks to https://stackoverflow.com/a/5016350/2563009.
    val screenLayout = resources.configuration.screenLayout
    return when {
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_SMALL -> "Small"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_NORMAL -> "Normal"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_LARGE -> "Large"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_XLARGE -> "Xlarge"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_UNDEFINED -> "Undefined"
      else -> error("Unknown screenLayout: $screenLayout")
    }
  }

1

Не могли бы вы сделать это, используя строковый ресурс и перечисления? Вы можете определить строковый ресурс с именем размера экрана, например, SMALL, MEDIUM или LARGE. Затем вы можете использовать значение строкового ресурса для создания экземпляра перечисления.

  1. Определите Enum в своем коде для разных размеров экрана, которые вас интересуют.

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. Определите строковый ресурс, скажем, screenize, значение которого будет SMALL, MEDIUM или LARGE.

    <string name="screensize">MEDIUM</string>
  3. Поместите копию screensizeв строковый ресурс в каждом измерении, которое вас волнует.
    Например, <string name="screensize">MEDIUM</string>помещается в values-sw600dp / strings.xml и values-medium / strings.xml и <string name="screensize">LARGE</string>помещается в sw720dp / strings.xml и values-large / strings.xml.
  4. В коде напиши
    ScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);

Это было многообещающе ... Однако я протестировал с 3 устройствами, и планшет все еще возвращает МАЛЕНЬКИЙ, когда я ожидаю БОЛЬШОЙ. Мои файлы string.xml определены внутри values-h1024dp, values-h700dp и values-h200dp с соответствующими <string name = "screenize "> xxxxxx </ string>
А. Массон

1

Скопируйте и вставьте этот код в свой, Activityи когда он будет выполнен, он будет Toastсоответствовать размеру экрана устройства.

int screenSize = getResources().getConfiguration().screenLayout &
        Configuration.SCREENLAYOUT_SIZE_MASK;

String toastMsg;
switch(screenSize) {
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        toastMsg = "Large screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        toastMsg = "Normal screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        toastMsg = "Small screen";
        break;
    default:
        toastMsg = "Screen size is neither large, normal or small";
}
Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.