Existe uma maneira de descobrir programaticamente se o dispositivo em que o aplicativo está instalado é um tablet de 7 ou 10 polegadas?
android
android-layout
screen
Novato
fonte
fonte
Respostas:
Você pode usar o
DisplayMetrics
para obter um monte de informações sobre a tela em que seu aplicativo está sendo executado.Primeiro, criamos um
DisplayMetrics
objeto metrics:A partir disso, podemos obter as informações necessárias para dimensionar a tela:
Isso retornará o valor absoluto da largura e da altura em pixels, portanto, 1280x720 para o Galaxy SIII, o Galaxy Nexus etc.
Isso geralmente não é útil por si só, pois quando estamos trabalhando em dispositivos Android, geralmente preferimos trabalhar em pixels independentes de densidade.
Você obtém o
density
da tela usandometrics
novamente, na forma de um fator de escala para o dispositivo, que é baseado nos Recursos de Design do Android paramdpi
,hdpi
etc.A partir desse resultado, podemos calcular a quantidade de pixels independentes de densidade que existem para uma certa altura ou largura.
O resultado obtido ajudará a decidir com que tipo de tela você está trabalhando em conjunto com os exemplos de configuração do Android , que fornecem o dp relativo para cada tamanho de tela:
Usando as informações acima, sabemos que se a menor largura do dispositivo for maior que 600dp, o dispositivo é um tablet de 7 ", se for maior que 720dp, o dispositivo é um tablet de 10".
Podemos calcular a menor largura usando a
min
função deMath
classe, passando oheightDp
e owidthDp
para retornar osmallestWidth
.No entanto, isso nem sempre fornece uma correspondência exata, especialmente ao trabalhar com tablets obscuros que podem estar apresentando sua densidade como hdpi quando não estão, ou que podem ter apenas 800 x 480 pixels, mas ainda estar em uma tela de 7 " .
Além desses métodos, se você precisar saber as dimensões exatas de um dispositivo em polegadas, poderá calcular isso também, usando o
metrics
método de quantos pixels existem por polegada da tela.Você pode usar o conhecimento de quantos pixels existem em cada polegada do dispositivo e a quantidade de pixels no total para descobrir quantas polegadas o dispositivo tem.
Isso retornará a altura e a largura do dispositivo em polegadas. Isso nem sempre é útil para determinar que tipo de dispositivo é, como o tamanho anunciado de um dispositivo é a diagonal, tudo o que temos é a altura e a largura.
No entanto, também sabemos que, dada a altura de um triângulo e a largura, podemos usar o teorema de Pitágoras para calcular o comprimento da hipotenusa (neste caso, o tamanho da diagonal da tela).
A partir disso, podemos descobrir se o dispositivo é um tablet ou não:
E é assim que você calcula com que tipo de dispositivo está trabalhando.
fonte
if (smallestWidth > 600) { /* 7" */ } else if (smallestWidth > 720) { /* 10" */ }
é falha: o tablet de 10 "é reconhecido como 7". Tomei a liberdade de consertar isso.resources.getConfiguration().smallestScreenWidthDp
de DeeV, que é o único método que fornece o mesmo valor tanto em retrato quanto em paisagem no meu Nexus 7 (600dp). Foi adicionado na API de nível 13.Não há nada que diga
7"
ou10"
AFAIK. Existem aproximadamente duas maneiras de obter as dimensões da tela que o sistema usa ao decodificar bitmaps e outros enfeites. Ambos são encontrados noResources
objeto do aplicativo encontrado noContext
.O primeiro é o
Configuration
objeto que pode ser obtido porgetContext().getResources().getConfiguration()
. Nele você tem:Configuration#densityDpi
- A densidade da tela de destino sendo renderizada, correspondendo ao qualificador de recurso de densidade.Configuration#screenHeightDp
- A altura atual do espaço de tela disponível, em unidades de dp, correspondendo ao qualificador de recurso de altura da tela.Configuration#screenWidthDp
- A largura atual do espaço de tela disponível, em unidades de dp, correspondendo ao qualificador de recurso de largura de tela.Configuration#smallestScreenWidthDp
- O menor tamanho de tela que um aplicativo verá em operação normal, correspondendo ao qualificador de recurso de menor largura de tela.Com isso, você pode muito bem usar as diretrizes de tela para descobrir se o seu dispositivo está puxando a partir das respectivas pastas de recursos especializados (
hdpi
,xhdpi
,large
,xlarge
, etc.).Lembre-se, estes são alguns dos baldes:
telas pequenas têm pelo menos 426 dp x 320 dp
320 dp: uma tela de telefone típica (240 x 320 ldpi, 320 x 480 mdpi, 480 x 800 hdpi etc.).
Mais informações
O segundo é o
DisplayMetrics
objeto obtido porgetContext().getResources().getDisplayMetrics()
. Nisso você tem:DisplayMetrics#density
- A densidade lógica da tela.DisplayMetrics#densityDpi
- A densidade da tela expressa em pontos por polegada.DisplayMetrics#heightPixels
- A altura absoluta da tela em pixels.DisplayMetrics#widthPixels
- A largura absoluta da tela em pixels.DisplayMetrics#xdpi
- Os pixels físicos exatos por polegada da tela na dimensão X.DisplayMetrics#ydpi
- Os pixels físicos exatos por polegada da tela na dimensão Y.Isso é útil se você precisar da contagem exata de pixels da tela em vez de densidade. No entanto, é importante notar que são todos os pixels da tela. Não apenas aqueles disponíveis para você.
fonte
smallestScreenWidthDp
. Ao contrário das outras soluções, dá o mesmo valor no meu Nexus 7 (600dp), independentemente da orientação . Como bônus, é também o código mais simples!coloque este método em onResume () e pode verificar.
geralmente os comprimidos começam após o tamanho de 6 polegadas.
fonte
Isso nem sempre funciona ao alternar entre retrato e paisagem.
Se você tem como meta a API de nível 13+, é fácil conforme descrito acima - use Configuration.smallestScreenWidthDp e teste de acordo:
Caso contrário, se você puder pagar por isso, use o método a seguir, que é uma abordagem muito precisa para detectar 600 dp (como 6 ") vs. 720 dp (como 10"), permitindo que o sistema diga a você:
1) Adicione ao layout-sw600dp e layout-sw720dp (e, se aplicável, sua paisagem) uma visualização invisível com o ID adequado, por exemplo:
Para 720, no layout-sw720dp:
Para 600, no layout-sw600dp:
2) Em seguida, no código, por exemplo, a Atividade, teste de acordo:
fonte
Ótima informação, exatamente o que eu estava procurando! No entanto, depois de tentar fazer isso, descobri que, ao usar as métricas mencionadas aqui, o Nexus 7 (modelo de 2012) reporta ter dimensões de 1280x736. Eu também tenho um Motorola Xoom executando Jelly Bean e ele informa incorretamente uma resolução de 1280x752. Me deparei com este post aqui que confirma isso. Basicamente, no ICS / JB os cálculos usando as métricas mencionadas acima parecem excluir as dimensões da Barra de Navegação. Mais algumas pesquisas me levaram à resposta de Frank Nguyen aqui, que usa métodos diferentes que fornecerão as dimensões de pixel brutas (ou reais) da tela. Meu teste inicial mostrou que o código a seguir de Frank relata corretamente as dimensões do Nexus 7 (modelo 2012 executando JB) e meu Motorola Xoom executando JB:
fonte
Tenho dois dispositivos Android com a mesma resolução
Dispositivo1 -> resolução 480x800 tamanho de tela diagonal -> 4,7 polegadas
Dispositivo2 -> resolução 480x800 tamanho de tela diagonal -> 4,0 polegadas
Ele dá ao dispositivo um tamanho de tela diagonal -> 5,8
a solução para o seu problema é ..
veja detalhes aqui ..
fonte
Eles maneira que o Android especifica tamanhos de tela é através de quatro tamanhos generalizadas: pequeno , normais , grande e xlarge .
Embora a documentação do Android afirme que os grupos de tamanho estão obsoletos
Geralmente, o qualificador de tamanho grande especifica um tablet de 7 ". E um qualificador de tamanho xlarge especifica um tablet de 10":
O bom sobre o acionamento no qualificador de tamanho é que você pode garantir que seus ativos e código estão de acordo sobre qual ativo usar ou caminho de código para ativar.
Para recuperar o qualificador de tamanho no código, faça as seguintes chamadas:
fonte
Você pode usar o método abaixo para obter o tamanho da tela em polegadas, baseando-se nisso simplesmente você pode verificar em qual tablet ou telefone o dispositivo está.
fonte
Eu estava armazenando um valor na pasta de valores que me dá uma tela de 7 polegadas ou 10 inc, mas podemos fazer isso para qualquer dispositivo usando a pasta de valores.
como criar uma pasta de 2 valores diferentes para 2 dispositivos diferentes. Mas isso depende do requisito.
fonte
Você terá que fazer alguns cálculos usando os dados fornecidos pela classe DisplayMetrics .
Você tem heightPixel e widthPixels (a resolução da tela em pixels)
Você precisa da diagonal, pois o 'tamanho da tela em polegadas' sempre descreve o comprimento diagonal. Você pode obter a diagonal da tela em pixels (usando o pythagore)
diagonalPixel = √ (heightPixel² + widthPixels²)
então você pode converter o valor do pixel em polegadas, graças ao valor de densidade DPI:
inchDiag = diagonalPixel / densidadeDPI.
Espero não ter cometido erros aqui, esteja ciente de que os valores que você obtém da classe DisplayMetrics são fornecidos pelo construtor, parece (em casos muito raros) que eles não estão bem definidos de acordo com o material físico ...
Isso fornecerá o tamanho físico da tela, mas provavelmente não é a melhor maneira de gerenciar vários layouts. Mais sobre este assunto
fonte
Outra maneira:
Crie mais 2 pastas: valores-grande + valores-xlarge
Coloque:
<string name="screentype">LARGE</string>
na pasta values-large (strings.xml)Coloque:
<string name="screentype">XLARGE</string>
na pasta values-xlarge (strings.xml)Em código:
String mType = getString (R.string.screentype);
if (mType! = null && mType.equals ("LARGE") {
// de 4 ~ 7 polegadas
} else if (mType! = null && mType.equals ("XLARGE") {
// de 7 a 10 polegadas
}
fonte
Voila! 😀 Isso é tudo que você precisa para distinguir tablets de telefones
1. Função auxiliar para obter a largura da tela:
2. Função para descobrir se um dispositivo é um tablet
3. Finalmente, se você deseja realizar diferentes operações para diferentes tamanhos de dispositivos:
fonte
Aqui estão algumas extensões úteis do kotlin:
fonte
Resources
emContext
:resources.displayMetrics.isTablet()
ou deWindowManager
qual armazenado emActivity
:val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.isTablet()