Como definir dimens.xml para cada tamanho de tela diferente no android?


128

Ao oferecer suporte a diferentes tamanhos de tela (densidades) no Android, o foco é criar layouts diferentes para todas as telas possíveis. IE

  • ldpi
  • mdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

Projetei um layout para uma tela xhdpi como referência e defini suas dimensões em dimens.xml . Agora , quero apoiá-lo em todos os tamanhos de tela possíveis. Como eu posso fazer isso?

Tanto quanto sei, posso usar essa ferramenta para descobrir o dimens.xml adequado para outros tamanhos de tela e adicioná-lo ao meu projeto. É o caminho certo para fazer isso na minha situação?

Outra pergunta: preciso criar dimens.xml apenas para as dimensões de tela acima? Se sim, então o que é w820dp?

Obrigado pela ajuda. Eu preciso suportar apenas telefones (não tablets ou outros dispositivos).


1
Sim, você precisa criar dimesn.xmlarquivos diferentes para diferentes resoluções.
— Piyush

@PiyushGupta Isso será para toda a tela dimensional acima? Mas o que é W820dpisso suportando uma versão diferente do Android? Além disso, você pode me sugerir algum tutorial sobre suporte a telas diferentes com base no dimens.xml?
— Amit Pal

É para tablet ou para outros. Caso contrário, como eu disse, você precisará criar uma pasta de valores diferentes.
— Piyush

Respostas:


266

Você precisa criar uma pasta de valores diferentes para telas diferentes . Gostar

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

insira a descrição da imagem aqui

Para mais informações você pode visitar aqui

Pastas de valores diferentes no android

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

Editado por @humblerookie

Você pode usar o plug-in do Android Studio chamado Dimenify para gerar automaticamente valores de dimensão para outros buckets de pixels com base em fatores de escala personalizados. Ainda está na versão beta, notifique quaisquer problemas / sugestões que você encontrar para o desenvolvedor.


1
não deveria haver "values-sw480dp-hdpi" .xhdpi e xxhdpi e assim por diante? apenas 320dp tem tal na sua resposta .. por favor responda
— Sharp Edge

2
@IntelliJAmiya: Você deve mencionar a diferença entre o Android <= 3.2 e> 3.2.
— juergen d

5
@IntelliJAmiya Criei um plugin de estúdio chamado Dimenify. Isso permite criar dimensões para outros baldes facilmente. Você poderia adicionar uma edição com a mesma para que outras pessoas possam usá-la? plugins.jetbrains.com/androidstudio/plugin/9349-dimenify
— humblerookie

3
Este Dimenify é uma ótima ferramenta
— Muhammed Refaat

1
@IntelliJAmiya, com certeza, haverá novos lançamentos que não serão abordados nessas pastas e / ou podem não ser apropriados em determinadas pastas.
— ralphgabb

35

Usar DP escalável

Embora criar um layout diferente para diferentes tamanhos de tela seja uma boa ideia, pode ser muito difícil acomodar todas as dimensões da tela e densidades de pixel. Ter mais de 20 dimens.xmlarquivos diferentes, conforme sugerido nas respostas acima, não é fácil de gerenciar.

Como usar:

Para usar sdp:

  1. Inclua implementation 'com.intuit.sdp:sdp-android:1.0.5'no seu build.gradle,
  2. Substitua qualquer dpvalor, como 50dppor um exemplo @dimen/50_sdp:

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

Como funciona:

sdpescala com o tamanho da tela porque é essencialmente uma lista enorme de diferentes dimens.xmlpara cada dpvalor possível .

insira a descrição da imagem aqui

Veja em ação:

Aqui está em três dispositivos com dimensões e densidades de tela bastante diferentes:

insira a descrição da imagem aqui

Observe que o sdpcálculo da unidade de tamanho inclui alguma aproximação devido a algumas restrições de desempenho e usabilidade.


Muito grato. Isso foi realmente útil para mim.
— Twenk11k

@Advait, você pode me dizer qual pasta de valores devo usar para o Samsung Edge 7 com celular de 5,5 polegadas com resolução de 2560x1440?
— ULHAS PATIL

@Advait Atualmente, estou usando a pasta values-xxhdpi, mas o problema é que ele está usando a mesma pasta para 5, 5,5 e 6 telas na mesma pasta, para que haja rolagem nas telas de 5 polegadas e 5,5. Eu não quero isso você pode me ajudar nisso?
— ULHAS PATIL

@Advait S valores-xxhdpi para 5,5" 1080x1920 e também para 5.5" 1440x2560 Quero pasta diferente para 5,5" 1440x2560.
— Ulhas PATIL

@ULHASPATIL exatamente! Encontrei um problema semelhante e não entendo como resolvê-lo. Você encontrou alguma solução para tela com polegadas semelhantes e resolução de pixel diferente?
— Georgiy Chebotarev 29/01

27

queremos ver as alterações no tamanho de visualização necessário em diferentes telas.

Precisamos criar pastas de valores diferentes para telas diferentes e colocar o arquivo dimens.xml com base na densidade da tela.

Peguei um TextView e observei as alterações quando alterei o dimens.xml em pastas de valores diferentes.

Por favor, siga o processo

normal - xhdpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o normal - xhdpi \ dimens.xml

nexus 5X (5,2 "* 1080 * 1920: 420 dpi)

nexo 6P (5,7 "* 1440 * 2560: 560 dpi)

nexus 6 (6,0 "* 1440 * 2560: 560 dpi)

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 \ dimens.xml

Os dispositivos abaixo podem alterar o tamanho das telas quando alteramos o Xlarge - xhdpi \ dimens.xml

nexo 9 (8,9 ", 2048 * 1556: xhdpi)

nexo 10 (10,1 ", 2560 * 1600: xhdpi)

grande - xhdpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o tamanho grande - xhdpi \ dimens.xml

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

nexo 7 (2012) (7,0 ", 800 * 1280: tvdpi)

As telas abaixo estão visíveis em "Pesquisar telefones e tablets genéricos"

grande - mdpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o tamanho grande - mdpi \ dimens.xml

5.1 "WVGA (480 * 800: mdpi)

5.4 "FWVGA (480 * 854: mdpi)

7.0 "WSVGA (Tablet) (1024 * 600: mdpi)

normal - hdpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o normal - hdpi \ dimens.xml

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

nexo um (3,7 ", 480 * 800: hdpi)

pequeno - ldpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o tamanho pequeno - ldpi \ dimens.xml

Controle deslizante QVGA de 2,7 "(240 * 320: ldpi)

2,7 "QVGA (240 * 320: ldpi)

xlarge - mdpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o xlarge - mdpi \ dimens.xml

WXGA de 10,1 "(tátil) (1280 * 800: MDPI)

normal - ldpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o normal - ldpi \ dimens.xml

3.3 "WQVGA (240 * 400: LDPI)

WQVGA de 3,4 "(240 * 432: LDPI)

normal - hdpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o normal - hdpi \ dimens.xml

4.0 "WVGA (480 * 800: hdpi)

3.7 "WVGA (480 * 800: hdpi)

Controle deslizante FWVGA de 3,7 "(480 * 854: hdpi)

normal - mdpi \ dimens.xml

Os dispositivos abaixo podem alterar os tamanhos das telas quando alteramos o normal - mdpi \ dimens.xml

Slider HVGA de 3,2 "(ADP1) (320 * 480: MDPI)

QVGA de 3,2 "(ADP2) (320 * 480: MDPI)


Então, de acordo com você, as pastas seriam nomeadas como algo assim values-normal-xhdpi?
— VonSchnauzer

Sim, eu concordo com você, em vez de escrever valores para todos os arquivos, eu disse: "crie pastas de valores diferentes para tamanhos de texto diferentes". Então, por favor leia o título. Obrigado.
— Kotwarao

9

Existem boas bibliotecas que cuidam de tudo e reduzem sua dor. Para usá-lo, basta adicionar duas dependências no gradle:

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

Depois disso, use dimensassim:

        android:layout_marginTop="@dimen/_80sdp"

3
Aqui estão as bibliotecas para referência: SDP e SSP . E obrigado por esta resposta precisa!
— JorgeAmVF 15/05/19

7

Fiz upload de um programa java simples que leva a localização do projeto e o arquivo de dimensão que você deseja como entrada. Com base nisso, ele produziria o arquivo de dimensão correspondente no console. Aqui está o link para ele:

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

Aqui está o código completo da referência:

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

Você precisa criar uma valuespasta diferente para telas diferentes e colocar o dimens.xmlarquivo de acordo com a densidade.

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)

Onde posso obter a relação entre o tamanho da tela? Como eu posso ver na ferramenta que definiu tudo ldpi, mdpimaneira
— Amit Pal

Isso depende da sua pasta de valores, que irá recuperar valores no máximo a partir dela.
— Piyush

Preciso mencionar o values-xxhdpiNexus 6?
— Amit Pal

Sim, você precisa ser!
— Piyush

320x480é um mdpi típico . Então, coloque-o em valuesou dentro devalues-mdpi
— Phantômaxx 1/15

6

Você pode colocar dimens.xmlem

1) valores

2) valores-hdpi

3) valores-xhdpi

4) valores-xxhdpi

E forneça tamanhos diferentes nas dimens.xmlpastas correspondentes, de acordo com a densidade.


2
De acordo com a documentação do Android, pequeno / normal / grande estão obsoletos.
— Benjamin Mesing

1

No caso de você querer ver mais: Aqui está uma ligação para uma lista de dispositivos (tablets, celulares, relógios), incluindo watch, chromebook, windowse mac. Aqui você pode encontrar a densidade, as dimensões e etc. Apenas com base aqui, é um bom recurso se você estiver usando um emulador também.

Se você clicar em um item específico, ele mostrará mais detalhes no lado direito. amostra

Desde que Androideu vou postar relacionados a ele. sample1

sample2

~ É melhor se você salvar uma cópia da web. Para vê-lo offline.


1

O Android 3.2 introduz uma nova abordagem para os tamanhos de tela; os números que descrevem o tamanho da tela estão todos em unidades “dp”.

menor largura dp: a menor largura disponível para o layout do aplicativo em unidades “dp”; esta é a menor largura de largura de banda que você encontrará em qualquer rotação da tela.

Para criar um clique com o botão direito do mouse em res >>> novo >>> diretório de recursos do Android

Na janela Qualificadores disponíveis , mova a Largura Menor da Tela para Qualificadores Escolhidos

Na janela Largura da tela , basta escrever o valor "dp" a partir de que você deseja que o Android Studio use esse efeito.

Em seguida, mude para a visualização Projeto , clique com o botão direito do mouse no novo diretório de recursos criado

novo >>> Arquivo de recursos de valores, insira um novo nome de arquivo dimens.xml e pronto.


Obrigado por explicar como realmente criar essas pastas.
— Beko 15/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.