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).

Amit Pal
fonte
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.

IntelliJ Amiya
fonte
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.

Advait S
fonte
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)

koteswarao
fonte
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"
Shivam Yadav
fonte
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);
    }
}
Akeshwar Jha
fonte
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)
Piyush
fonte
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.

Anoop M
fonte
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.

RoCk RoCk
fonte
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.

Levon Petrosyan
fonte
Obrigado por explicar como realmente criar essas pastas.
Beko 15/03