Как поддерживать разные размеры экрана в Android - PullRequest
46 голосов
/ 24 ноября 2011

Я занимаюсь разработкой приложения для Android, и я должен поддерживать все размеры и плотность экрана.Поэтому я создал другую папку для макета: layout-small layout-large и layout.

Затем я создал другую папку для изображения: ldpi, mdpi и hdpi.Во всех нарисованных папках изображение должно быть разного размера, верно?Я спрашиваю об этой причине, у меня есть телефон с большим размером экрана и средней плотностью, показанное изображение будет меньше, и они не будут принимать правильный размер?

Ответы [ 9 ]

74 голосов
/ 24 ноября 2011

Для экрана другого размера. Ниже приведен список каталогов ресурсов в приложении, которое предоставляет различные схемы компоновки для экранов разного размера и различные растровые рисунки для экранов малого, среднего, высокого и сверхвысокой плотности.

res/layout/my_layout.xml             // layout for normal screen size ("default")
res/layout-small/my_layout.xml       // layout for small screen size
res/layout-large/my_layout.xml       // layout for large screen size
res/layout-xlarge/my_layout.xml      // layout for extra large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation

res/drawable-mdpi/my_icon.png        // bitmap for medium density
res/drawable-hdpi/my_icon.png        // bitmap for high density
res/drawable-xhdpi/my_icon.png       // bitmap for extra high density

Следующий код в манифесте поддерживает все dpis.

<supports-screens android:smallScreens="true" 
          android:normalScreens="true" 
          android:largeScreens="true"
          android:xlargeScreens="true"
          android:anyDensity="true" />

А также посмотрите мой ТАК .

9 голосов
/ 04 марта 2015

Вы можете использовать единицу измерения sdp вместо единицы измерения dp. Размер sdp зависит от размера экрана, и поэтому он часто предпочитается для таргетинга на несколько размеров экрана.

Используйте это осторожно! например, в большинстве случаев вам все равно нужно разработать другой макет для планшетов.

6 голосов
/ 01 ноября 2016

Начиная с Android 3.2 (уровень API 13), группы размеров (папки small, normal, large, xlarge) устарели в пользу нового метода управления размерами экрана на основе доступной ширины экрана.



Существуют различные конфигурации ресурсов, которые вы можете указать в зависимости от места, доступного для вашего макета:

1) Наименьшая ширина - основной размер экрана, обозначенный кратчайшим размером доступной области экрана.

Значение квалификатора: sw'dp value'dp

Например. res / sw600dp / layout.xml -> будет использоваться для всех размеров экрана, больших или равных 600dp. Это не учитывает ориентацию устройства.


2) Доступная ширина экрана - определяет минимальную доступную ширину в единицах dp, при которой должны использоваться ресурсы.

Значение квалификатора: w'dp value'dp

Например. res / w600dp / layout.xml -> будет использоваться для всех экранов, ширина которых больше или равна 600dp.


3) Доступная высота экрана - указывает минимальную высоту экрана в единицах dp, при которой должны использоваться ресурсы.

Значение квалификатора: h'dp value'dp

Например. res / h600dp / layout.xml -> будет использоваться для всех экранов, высота которых больше или равна 600dp.



Итак, в конце ваша структура папок может выглядеть так:

res / layout / layout.xml -> для мобильных телефонов (доступная ширина меньше 600 dp)
res / layout-sw600dp / layout.xml -> для 7-дюймовых планшетов (шириной 600 дп и более)
res / layout-sw720dp / layout.xml -> для 10-дюймовых планшетов (шириной 720dp и больше)


Для получения дополнительной информации, пожалуйста, прочитайте официальную документацию:
https://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts
5 голосов
/ 06 декабря 2016

Звучит возвышенно, когда речь идет о поддержке нескольких размеров экрана. Следующие результаты дают лучшие результаты.

res/layout/layout-w120dp
res/layout/layout-w160dp
res/layout/layout-w240dp
res/layout/layout-w160dp
res/layout/layout-w320dp
res/layout/layout-w480dp
res/layout/layout-w600dp
res/layout/layout-w720dp

Проверьте ширину и высоту устройства, используя метрики дисплея

Разместите / раскройтекакой макет подходит для приведенной ширины устройства.

let smallestScreenWidthDp="assume some value(Which will be derived from Display metrics)"

Все должно быть проверено перед setContentView (). В противном случае вы попадаете в беду

     Configuration config = getResources().getConfiguration();

     Configuration config = getResources().getConfiguration();

        if (config.smallestScreenWidthDp >= 600) {
            setContentView(R.layout.layout-w600dp);
        } else {
            setContentView(R.layout.main_activity);
        }

В верхней части у меня естьСоздано так много макетов, чтобы уместиться на нескольких экранах, все зависит от вас, можете вы или нет. Вы можете просмотреть обзоры магазина игр, из которых API, «Высокие загрузки», которые вы должны продолжить.

Надеюсь, это вам очень поможет. Мало кто использовал сторонние библиотеки, это может уменьшить вашу работу, но это не лучшая практика.Привыкайте к Android Best Practices.

Проверьте это

3 голосов
/ 24 ноября 2011

Android настроить самостоятельно, вы можете поместить отдельное изображение для другой папки, если вы хотите использовать разные изображения для устройств с высоким разрешением и других устройств. В противном случае просто поместите в одну папку для рисования только для некоторых изображений, которые вы можете сделать 9-патч.

читать здесь

вам нужно разрешение в манифесте для нескольких экранов ссылка поддержки

<supports-screens android:resizeable=["true"| "false"]
                  android:smallScreens=["true" | "false"]
                  android:normalScreens=["true" | "false"]
                  android:largeScreens=["true" | "false"]
                  android:xlargeScreens=["true" | "false"]
                  android:anyDensity=["true" | "false"]
                  android:requiresSmallestWidthDp="integer"
                  android:compatibleWidthLimitDp="integer"
                  android:largestWidthLimitDp="integer"/>
2 голосов
/ 30 января 2018

использовать библиотеку sdp, которая предоставляется в github

2 голосов
/ 18 июня 2013

Вы можете определить размеры экрана динамически

Display mDisplay= activity.getWindowManager().getDefaultDisplay();
int width= mDisplay.getWidth();
int Height= mDisplay.getHeight();

Макет может быть установлен с использованием ширины и высоты, полученных с помощью этого метода.

0 голосов
/ 09 сентября 2012

вы можете создавать растровые изображения для более высокого разрешения / размера, которое будет запускать ваше приложение, и изменять их размер в коде (во время выполнения)

проверить эту статью http://nuvornapps -en.blogspot.com.es /

0 голосов
/ 24 ноября 2011

Добавление в @ ud_an

Не рекомендуется создавать разные папки для макетов.Создайте свой макет так, чтобы он отлично работал со всеми размерами экрана.Чтобы добиться этого, поиграйте с атрибутами макета.Вам нужны только разные изображения для типов hdpi, mdpi и ldpi.Остальные будут управляться ОС Android.

...