¿Hay alguna manera de encontrar mediante programación si el dispositivo en el que está instalada la aplicación es una tableta de 7 pulgadas o una tableta de 10 pulgadas?
android
android-layout
screen
Novato
fuente
fuente
Respuestas:
Puede usar el
DisplayMetrics
para obtener una gran cantidad de información sobre la pantalla en la que se ejecuta su aplicación.Primero, creamos un
DisplayMetrics
objeto de métricas:A partir de esto, podemos obtener la información necesaria para dimensionar la pantalla:
Esto devolverá el valor absoluto del ancho y la altura en píxeles, por lo que 1280x720 para el Galaxy SIII, el Galaxy Nexus, etc.
Por lo general, esto no es útil por sí solo, ya que cuando trabajamos en dispositivos Android, generalmente preferimos trabajar en píxeles independientes de la densidad, dip.
Obtienes
density
el tamaño de la pantalla usandometrics
nuevamente, en forma de un factor de escala para el dispositivo, que se basa en los Recursos de diseño de Android paramdpi
,hdpi
etc.A partir de este resultado, podemos calcular la cantidad de píxeles independientes de la densidad que hay para una determinada altura o anchura.
El resultado que obtenga de esto lo ayudará a decidir con qué tipo de pantalla está trabajando junto con los ejemplos de configuración de Android , que le brindan el dp relativo para cada tamaño de pantalla:
Usando la información anterior, sabemos que si el ancho más pequeño del dispositivo es mayor que 600dp, el dispositivo es una tableta de 7 ", si es mayor que 720dp, el dispositivo es una tableta de 10".
Podemos calcular el ancho más pequeño usando la
min
función deMath
clase, pasando elheightDp
y elwidthDp
para devolver elsmallestWidth
.Sin embargo, esto no siempre le da una coincidencia exacta, especialmente cuando se trabaja con tabletas oscuras que pueden estar tergiversando su densidad como hdpi cuando no lo es, o que solo pueden tener 800 x 480 píxeles y aún así estar en una pantalla de 7 ". .
Además de estos métodos, si alguna vez necesita saber las dimensiones exactas de un dispositivo en pulgadas, también puede calcularlo utilizando el
metrics
método de cuántos píxeles hay por pulgada de la pantalla.Puede utilizar el conocimiento de cuántos píxeles hay en cada pulgada del dispositivo y la cantidad de píxeles en total para calcular cuántas pulgadas tiene el dispositivo.
Esto devolverá la altura y el ancho del dispositivo en pulgadas. Nuevamente, esto no siempre es tan útil para determinar qué tipo de dispositivo es, ya que el tamaño anunciado de un dispositivo es la diagonal, todo lo que tenemos es la altura y el ancho.
Sin embargo, también sabemos que, dada la altura y el ancho de un triángulo, podemos usar el teorema de Pitágoras para calcular la longitud de la hipotenusa (en este caso, el tamaño de la diagonal de la pantalla).
A partir de esto, podemos averiguar si el dispositivo es una tableta o no:
Y así es como calcula con qué tipo de dispositivo está trabajando.
fuente
if (smallestWidth > 600) { /* 7" */ } else if (smallestWidth > 720) { /* 10" */ }
es defectuosa: la tableta de 10 "se reconoce como de 7". Me tomé la libertad de arreglar eso.resources.getConfiguration().smallestScreenWidthDp
de DeeV, que es el único método que da el mismo valor tanto en vertical como en horizontal en mi Nexus 7 (600dp). Se agregó en el nivel de API 13.No hay nada que diga
7"
o10"
AFAIK. Hay aproximadamente dos formas de obtener las dimensiones de la pantalla que utiliza el sistema al decodificar mapas de bits y otras cosas. Ambos se encuentran en elResources
objeto de la aplicación que se encuentra enContext
.El primero es el
Configuration
objeto que puede obtenersegetContext().getResources().getConfiguration()
. En ella tienes:Configuration#densityDpi
- La densidad de pantalla de destino a la que se está representando, correspondiente al calificador de recursos de densidad.Configuration#screenHeightDp
- La altura actual del espacio de pantalla disponible, en unidades de dp, correspondiente al calificador de recursos de altura de pantalla.Configuration#screenWidthDp
- El ancho actual del espacio de pantalla disponible, en unidades de dp, correspondiente al calificador de recursos de ancho de pantalla.Configuration#smallestScreenWidthDp
- El tamaño de pantalla más pequeño que verá una aplicación en el funcionamiento normal, correspondiente al calificador de recursos de ancho de pantalla más pequeño.Con esto, se puede utilizar más o menos las directrices de la pantalla para averiguar si el dispositivo está tirando de las respectivas carpetas de recursos especializados (
hdpi
,xhdpi
,large
,xlarge
, etc.).Recuerde, estos son algunos de los depósitos:
las pantallas pequeñas miden al menos 426dp x 320dp
320dp: una pantalla de teléfono típica (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc.).
Más información
El segundo es el
DisplayMetrics
objeto obtenido porgetContext().getResources().getDisplayMetrics()
. En eso tienes:DisplayMetrics#density
- La densidad lógica de la pantalla.DisplayMetrics#densityDpi
- La densidad de la pantalla expresada en puntos por pulgada.DisplayMetrics#heightPixels
- La altura absoluta de la pantalla en píxeles.DisplayMetrics#widthPixels
- El ancho absoluto de la pantalla en píxeles.DisplayMetrics#xdpi
- Los píxeles físicos exactos por pulgada de la pantalla en la dimensión X.DisplayMetrics#ydpi
- Los píxeles físicos exactos por pulgada de la pantalla en la dimensión Y.Esto es útil si necesita un número exacto de píxeles de la pantalla en lugar de la densidad. Sin embargo, es importante tener en cuenta que se trata de todos los píxeles de la pantalla. No solo los que están disponibles para ti.
fuente
smallestScreenWidthDp
. A diferencia de las otras soluciones, da el mismo valor en mi Nexus 7 (600dp) independientemente de la orientación . Como beneficio adicional, ¡también es el código más simple!coloque este método en onResume () y puede verificar.
generalmente las tabletas comienzan después del tamaño de 6 pulgadas.
fuente
Lo anterior no siempre funciona cuando se cambia de retrato a paisaje.
Si tiene como objetivo el nivel de API 13+, es fácil como se describe anteriormente: use Configuration.smallestScreenWidthDp, luego pruebe en consecuencia:
De lo contrario, si puede pagar esto, utilice el siguiente método, que es un enfoque muy preciso para detectar 600 dp (como 6 ") frente a 720dp (como 10") al permitir que el sistema le diga:
1) Agregue a layout-sw600dp y layout-sw720dp (y si corresponde a su paisaje) una vista invisible con la identificación adecuada, por ejemplo:
Para 720, en layout-sw720dp:
Para 600, en layout-sw600dp:
2) Luego, en el código, por ejemplo, la Actividad, pruebe en consecuencia:
fuente
Excelente información, ¡justo lo que estaba buscando! Sin embargo, después de probar esto, descubrí que al usar las métricas mencionadas aquí, Nexus 7 (modelo 2012) informa que tiene dimensiones de 1280x736. También tengo un Motorola Xoom con Jelly Bean y reporta incorrectamente una resolución de 1280x752. Me topé con esta publicación aquí que lo confirma. Básicamente, en ICS / JB, los cálculos que utilizan las métricas mencionadas anteriormente parecen excluir las dimensiones de la barra de navegación. Un poco más de investigación me llevó a la respuesta de Frank Nguyen aquí que utiliza diferentes métodos que le darán las dimensiones de píxeles en bruto (o reales) de la pantalla. Mi prueba inicial ha demostrado que el siguiente código de Frank correclty informa las dimensiones en el Nexus 7 (modelo 2012 con JB) y mi Motorola Xoom con JB:
fuente
Tengo dos dispositivos Android con la misma resolución.
Dispositivo1 -> resolución 480x800 diagonal tamaño de pantalla -> 4,7 pulgadas
Device2 -> resolución 480x800 diagonal tamaño de pantalla -> 4.0 pulgadas
Le da a ambos dispositivos un tamaño de pantalla diagonal -> 5.8
la solución a tu problema es ...
ver detalles aquí ..
fuente
La forma en que Android especifica los tamaños de pantalla es a través de cuatro tamaños generalizados: pequeño , normal , grande y xlarge .
Mientras que la documentación de Android indica que los grupos de tamaño están obsoletos
Generalmente, el calificador de tamaño grande especifica una tableta de 7 ". Y un calificador de tamaño de xlarge especifica una tableta de 10":
Lo bueno de activar el calificador de tamaño es que puede garantizar que sus activos y su código coincidan sobre qué activo usar o qué ruta de código activar.
Para recuperar el calificador de tamaño en el código, realice las siguientes llamadas:
fuente
Puede usar el método a continuación para obtener el tamaño de la pantalla en pulgadas, basándose en eso, simplemente puede verificar qué tableta o teléfono es el dispositivo.
fuente
Estaba almacenando un valor en la carpeta de valores que me da una pantalla de 7 pulgadas o 10 inc, pero podemos hacerlo para cualquier dispositivo que use la carpeta de valores.
como crear una carpeta de valores 2 diferentes para 2 dispositivos diferentes. Pero esto depende del requisito.
fuente
Tendrá que hacer un pequeño cálculo utilizando los datos proporcionados por la clase DisplayMetrics .
Tiene heightPixel y widthPixels (la resolución de pantalla en píxeles)
Necesita la diagonal ya que el 'tamaño de pantalla en pulgadas' siempre describe la longitud de la diagonal. Puede obtener la diagonal de la pantalla en píxeles (usando Pythagore)
diagonalPixel = √ (heightPixel² + widthPixels²)
luego puede convertir el valor de píxel a pulgadas gracias al valor de densidadDPI:
inchDiag = diagonalPixel / densidadDPI.
Espero no haber cometido errores aquí, tenga en cuenta que los valores que obtiene de la clase DisplayMetrics los da el constructor, parece (en casos muy raros) que no están bien configurados de acuerdo con el material físico ...
Esto le dará el tamaño físico de la pantalla, pero probablemente no sea la mejor manera de administrar varios diseños. Más sobre estos temas
fuente
De otra manera:
Cree 2 carpetas más: valores-grande + valores-xlarge
Poner:
<string name="screentype">LARGE</string>
en la carpeta de valores grandes (strings.xml)Poner:
<string name="screentype">XLARGE</string>
en la carpeta values-xlarge (strings.xml)En codigo:
String mType = getString (R.string.screentype);
if (mType! = null && mType.equals ("GRANDE") {
// de 4 ~ 7 pulgadas
} else if (mType! = null && mType.equals ("XLARGE") {
// de 7 ~ 10 pulgadas
}
fuente
¡Voila! 😀 Esto es todo lo que necesita para distinguir las tabletas de los teléfonos
1. Función auxiliar para obtener el ancho de la pantalla:
2. Función para averiguar si un dispositivo es una tableta
3. Finalmente, si está buscando realizar diferentes operaciones para diferentes tamaños de dispositivos:
fuente
Aquí algunas extensiones útiles de kotlin:
fuente
Resources
enContext
:resources.displayMetrics.isTablet()
o desde elWindowManager
que se almacenó enActivity
:val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.isTablet()