Как определить размер.xml для каждого размера экрана в Android?

129

При поддержке различных размеров экрана (плотности) в Android часто основное внимание уделяется созданию разных макетов для каждого возможного экрана. IE

  • ldpi
  • MDPI
  • ИПЧР
  • xhdpi
  • xxhdpi
  • xxxhdpi

Я разработал макет для экрана xhdpi в качестве справочного материала и определил его размеры в файле sizes.xml . Теперь я хочу поддержать все возможные размеры экрана. Как я могу это сделать?

Насколько мне известно, я могу использовать этот инструмент, чтобы определить правильный файл sizes.xml для других размеров экрана и добавить его в свой проект. Это правильный способ сделать это в моей ситуации?

Другой вопрос, нужно ли мне создавать только sizes.xml для указанных выше размеров экрана? Если да, то что w820dp?

Спасибо за вашу помощь. Мне нужно поддерживать только телефоны (а не планшеты или другие устройства).

Амит Пал
источник
1
Да, вам нужно создавать разные dimesn.xmlфайлы для разных разрешений.
Пиюш
@PiyushGupta Что будет для всего вышеперечисленного габаритного экрана? Но что W820dpэто за то, что поддерживает другую версию Android? Также можете ли вы предложить мне какое-либо руководство по поддержке разных экранов на основе sizes.xml?
Амит Пал
Это для планшета или для других. В противном случае, как я уже сказал, вам нужно создать другую папку значений.
Пиюш

Ответы:

267

Вам необходимо создать папку «Различные значения» для разных экранов . подобно

values-sw720dp          10.1 tablet 1280x800 mdpi

values-sw600dp          7.0  tablet 1024x600 mdpi

values-sw480dp          5.4  480x854 mdpi 
values-sw480dp          5.1  480x800 mdpi 

values-xxhdpi           5.5"  1080x1920 xxhdpi
values-xxxhdpi           5.5" 1440x2560 xxxhdpi

values-xhdpi            4.7   1280x720 xhdpi 
values-xhdpi            4.65  720x1280 xhdpi 

values-hdpi             4.0 480x800 hdpi
values-hdpi             3.7 480x854 hdpi

values-mdpi             3.2 320x480 mdpi

values-ldpi             3.4 240x432 ldpi
values-ldpi             3.3 240x400 ldpi
values-ldpi             2.7 240x320 ldpi

введите описание изображения здесь

Для получения дополнительной информации вы можете посетить здесь

Папки с разными значениями в android

http://android-developers.blogspot.in/2011/07/new-tools-for-managing-screen-sizes.html

Под редакцией По @humblerookie

Вы можете использовать плагин Android Studio под названием Dimenify для автоматического создания значений размеров для других сегментов пикселей на основе настраиваемых коэффициентов масштабирования. Он все еще находится в стадии бета-тестирования, обязательно сообщайте разработчику о любых проблемах / предложениях.

IntelliJ Amiya
источник
1
разве не должно быть "values-sw480dp-hdpi" .xhdpi и xxhdpi и так далее? только 320dp есть в вашем ответе .. ответьте пожалуйста
Sharp Edge
2
@IntelliJAmiya: Вы должны упомянуть разницу между Android <= 3.2 и> 3.2.
juergen d
5
@IntelliJAmiya Я создал студийный плагин под названием Dimenify. Это позволяет легко создавать размеры для других ковшей. Не могли бы вы добавить редактирование с тем же самым, чтобы другие могли его использовать? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
humblerookie
3
Это Dimenify - отличный инструмент
Мухаммед Рефаат
1
@IntelliJAmiya наверняка появятся новые выпуски, которые не будут охватываться этими папками и / или могут не подходить для определенных папок.
ralphgabb
36

Используйте масштабируемый DP

Хотя создание другого макета для разных размеров экрана теоретически является хорошей идеей, может быть очень сложно приспособить его для всех размеров экрана и плотности пикселей. Имея более 20+ разных dimens.xmlфайлов, как предложено в приведенных выше ответах, совсем непросто управлять.

Как пользоваться:

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

  1. Включите implementation 'com.intuit.sdp:sdp-android:1.0.5'в свой build.gradle,
  2. Заменить dpзначение , например 50dpс @dimen/50_sdpпримерно так:

    <TextView
     android:layout_width="@dimen/_50sdp"
     android:layout_height="@dimen/_50sdp"
     android:text="Hello World!" />

Как это устроено:

sdpмасштабируется вместе с размером экрана, потому что это, по сути, огромный список различных значений dimens.xmlдля всех возможных dpзначений.

введите описание изображения здесь

Посмотреть в действии:

Вот он на трех устройствах с сильно различающимися размерами экрана и плотностью:

введите описание изображения здесь

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

Адвайт С
источник
1
Весьма признателен. Это было действительно полезно для меня.
twenk11k 05
@Advait, не могли бы вы сказать мне, какую папку значений следует использовать для Samsung Edge 7 с 5,5-дюймовым мобильным телефоном с разрешением 2560x1440?
УЛХАС ПАТИЛЬ
@Advait в настоящее время я использую папку values-xxhdpi, но проблема в том, что она занимает одну и ту же папку для 5, 5.5 и 6 экранов в той же папке, поэтому на 5-дюймовых экранах и 5.5 появляется прокрутка. Я не хочу этого. не могли бы вы помочь мне в этом?
УЛХАС ПАТИЛЬ
@Advait S values-xxhdpi для 5.5 "1080x1920 и также для 5.5" 1440x2560 Мне нужна другая папка для 5.5 "1440x2560.
УЛХАС ПАТИЛ 09
@ULHASPATIL именно так! Я столкнулся с подобной проблемой и не понимаю, как ее решить. Нашли ли вы какое-нибудь решение для экрана с одинаковым размером и разным разрешением пикселей?
Георгий Чеботарев
27

мы хотим видеть изменения требуемого размера просмотра на разных экранах.

Нам нужно создать разные папки значений для разных экранов и поместить файл sizes.xml в зависимости от плотности экрана.

Я взял один TextView и наблюдал за изменениями, когда я менял sizes.xml в разных папках значений.

Пожалуйста, следите за процессом

нормальный - xhdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем нормальный - xhdpi \ sizes.xml

nexus 5X (5,2 дюйма * 1080 * 1920: 420 точек на дюйм)

nexus 6P (5,7 дюймов * 1440 * 2560: 560 точек на дюйм)

nexus 6 (6,0 дюймов * 1440 * 2560: 560 точек на дюйм)

nexus 5 (5,0 ", 1080 1920: xxhdpi)

nexus 4 (4,7 дюйма, 768 * 1280: xhdpi)

Galaxy nexus (4,7 дюйма, 720 * 1280: xhdpi)

4,65 дюйма, 720p (720 * 1280: xhdpi)

4,7 дюйма, WXGA (1280 * 720: Xhdpi)

Xlarge - xhdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем Xlarge - xhdpi \ sizes.xml.

nexus 9 (8,9 дюйма, 2048 * 1556: xhdpi)

nexus 10 (10,1 дюйма, 2560 * 1600: xhdpi)

большой - xhdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем большой - xhdpi \ sizes.xml.

nexus 7 (7,0 ", 1200 * 1920: xhdpi)

nexus 7 (2012 г.) (7,0 дюймов, 800 * 1280: tvdpi)

Следующие экраны видны в «Поиске обычных телефонов и планшетов».

большой - mdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем большой - mdpi \ sizes.xml

5,1 дюйма, WVGA (480 * 800: mdpi)

5,4 дюйма, FWVGA (480 * 854: mdpi)

7,0 "WSVGA (планшет) (1024 * 600: mdpi)

нормальный - hdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем нормальный - hdpi \ sizes.xml

nexus s (4,0 ", 480 * 800: hdpi)

nexus one (3,7 дюйма, 480 * 800: hdpi)

маленький - ldpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем маленький - ldpi \ sizes.xml

2,7-дюймовый слайдер QVGA (240 * 320: ldpi)

2,7 дюйма, QVGA (240 * 320: ldpi)

xlarge - mdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем xlarge - mdpi \ sizes.xml.

10,1 дюйма, WXGA (ПЛАНШЕТ) (1280 * 800: MDPI)

нормальный - ldpi \ sizes.xml

Следующие ниже устройства могут изменять размеры экранов, когда мы меняем нормальный - ldpi \ sizes.xml

3,3 дюйма, WQVGA (240 * 400: LDPI)

3,4 дюйма, WQVGA (240 * 432: LDPI)

нормальный - hdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем нормальный - hdpi \ sizes.xml

4,0 дюйма, WVGA (480 * 800: hdpi)

3,7 дюйма, WVGA (480 * 800: hdpi)

3,7-дюймовый слайдер FWVGA (480 * 854: hdpi)

нормальный - mdpi \ sizes.xml

Приведенные ниже устройства могут изменять размеры экранов, когда мы меняем нормальный - mdpi \ sizes.xml

3,2-дюймовый слайдер HVGA (ADP1) (320 * 480: MDPI)

3,2 дюйма, QVGA (ADP2) (320 * 480: MDPI)

koteswarao
источник
Итак, по вашему мнению, тогда папки будут называться примерно так values-normal-xhdpi?
VonSchnauzer
Да, я согласен с вами, вместо записи значений во все файлы, я сказал, «создавайте разные папки значений для разных размеров текста». Пожалуйста, прочтите название. Спасибо.
koteswarao
9

Есть хорошие библиотеки, которые справятся со всем и уменьшат вашу боль. Чтобы использовать его, просто добавьте две зависимости в gradle:

 implementation 'com.intuit.ssp:ssp-android:1.0.5'
 implementation 'com.intuit.sdp:sdp-android:1.0.5'

После этого используйте dimensтак:

        android:layout_marginTop="@dimen/_80sdp"
Шивам Ядав
источник
3
Вот библиотеки для справки: SDP и SSP . И спасибо за точный ответ!
JorgeAmVF
7

Я загрузил простую программу на Java, которая принимает на вход местоположение вашего проекта и нужный вам размерный файл. Исходя из этого, он выведет соответствующий файл измерения в консоль. Вот ссылка на него:

https://github.com/akeshwar/Dimens-for-different-screens-in-Android/blob/master/Main.java

Вот полный код для справки:

public class Main {


    /**
     * You can change your factors here. The current factors are in accordance with the official documentation.
     */
    private static final double LDPI_FACTOR = 0.375;
    private static final double MDPI_FACTOR = 0.5;
    private static final double HDPI_FACTOR = 0.75;
    private static final double XHDPI_FACTOR = 1.0;
    private static final double XXHDPI_FACTOR = 1.5;
    private static final double XXXHDPI_FACTOR = 2.0;

    private static double factor;

    public static void main(String[] args) throws IOException {


        Scanner in = new Scanner(System.in);
        System.out.println("Enter the location of the project/module");
        String projectPath = in.nextLine();

        System.out.println("Which of the following dimension file do you want?\n1. ldpi \n2. mdpi \n3. hdpi \n4. xhdpi \n5. xxhdpi \n6. xxxhdpi");

        int dimenType = in.nextInt();

        switch (dimenType) {
            case 1: factor = LDPI_FACTOR;
                break;
            case 2: factor = MDPI_FACTOR;
                break;
            case 3: factor = HDPI_FACTOR;
                break;
            case 4: factor = XHDPI_FACTOR;
                break;
            case 5: factor = XXHDPI_FACTOR;
                break;
            case 6: factor = XXXHDPI_FACTOR;
                break;
            default:
                factor = 1.0;
        }

        //full path = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/src/main/res/values/dimens.xml"
        //location of the project or module = "/home/akeshwar/android-sat-bothIncluded-notintegrated/code/tpr-5-5-9/princetonReview/"


        /**
         * In case there is some I/O exception with the file, you can directly copy-paste the full path to the file here:
         */
        String fullPath = projectPath + "/src/main/res/values/dimens.xml";

        FileInputStream fstream = new FileInputStream(fullPath);
        BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

        String strLine;

        while ((strLine = br.readLine()) != null)   {
            modifyLine(strLine);
        }
        br.close();

    }

    private static void modifyLine(String line) {

        /**
         * Well, this is how I'm detecting if the line has some dimension value or not.
         */
        if(line.contains("p</")) {
            int endIndex = line.indexOf("p</");

            //since indexOf returns the first instance of the occurring string. And, the actual dimension would follow after the first ">" in the screen
            int begIndex = line.indexOf(">");

            String prefix = line.substring(0, begIndex+1);
            String root = line.substring(begIndex+1, endIndex-1);
            String suffix = line.substring(endIndex-1,line.length());


            /**
             * Now, we have the root. We can use it to create different dimensions. Root is simply the dimension number.
             */

            double dimens = Double.parseDouble(root);
            dimens = dimens*factor*1000;
            dimens = (double)((int)dimens);
            dimens = dimens/1000;
            root = dimens + "";

            System.out.println(prefix + " " +  root + " " + suffix );

        }

        System.out.println(line);
    }
}
Акешвар Джа
источник
6

Вы должны создать разные valuesпапки для разных экранов и поместить dimens.xmlфайл в соответствии с плотностью.

1) values

2) values-hdpi (320x480 ,480x800)

3) values-large-hdpi (600x1024)

4) values-xlarge (720x1280 ,768x1280 ,800x1280 ,Nexus7 ,Nexus10)

5) values-sw480dp (5.1' WVGA screen)

6) values-xhdpi (Nexus4 , Galaxy Nexus)
Piyush
источник
Где взять соотношение размеров экрана? Как я могу видеть в инструменте они определили все в ldpi, mdpiпорядок
Amit Пал
Это будет зависеть от вашей папки значений, которая будет получать значения максимум из нее.
Пиюш
Нужно ли мне упоминать values-xxhdpiNexus 6?
Амит Пал
Да тебе нужно быть!
Пиюш
320x480это типичный mdpi . Итак, вставьте его либо valuesvalues-mdpi
внутрь,
6

Вы можете поместить dimens.xmlв

1) ценности

2) значения-hdpi

3) значения-xhdpi

4) значения-xxhdpi

И укажите разные размеры в dimens.xmlсоответствующих папках в зависимости от плотности.

Ануп М
источник
2
Согласно документации Android, малый / нормальный / большой устарел.
Бенджамин Месинг
1

В случае , если вы хотите , чтобы узнать больше: Вот ссылка на список устройств (планшеты, мобильные, часы), в том числе watch, chromebook, windowsи mac. Здесь вы можете найти плотность, размеры и т. Д. Основываясь на этом, это хороший ресурс, если вы тоже используете эмулятор.

Если вы щелкнете по конкретному элементу, справа отобразятся дополнительные сведения. образец

Поскольку это Android, я опубликую по этому поводу . sample1

sample2

~ Лучше, если вы сохраните копию в Интернете. Для просмотра офлайн.

RoCk RoCk
источник
1

В Android 3.2 представлен новый подход к размеру экрана: все числа, описывающие размер экрана, выражены в единицах «dp». В основном мы можем использовать

наименьшая ширина dp: наименьшая ширина, доступная для макета приложения в единицах «dp»; это самая маленькая ширина dp, с которой вы когда-либо сталкивались при любом повороте дисплея.

Чтобы создать, щелкните правой кнопкой мыши res >>> new >>> Каталог ресурсов Android.

Из окна Доступных квалификаторов переместите Наименьшую ширину экрана в Выбранные квалификаторы

В окне ширины экрана просто введите значение «dp», начиная с того, что вы хотите, чтобы Android Studio использовала эти размеры.

Затем перейдите в представление проекта , щелкните правой кнопкой мыши новый созданный каталог ресурсов.

new >>> Values ​​resource file введите новое имя файла sizes.xml, и все готово.

Левон Петросян
источник
Спасибо за объяснение, как на самом деле создавать эти папки.
Беко