La barra de navegación negra en la parte inferior de la pantalla no se puede quitar fácilmente en Android. Ha sido parte de Android desde 3.0 como reemplazo de botones de hardware. Aquí hay una imagen:
¿Cómo puedo obtener el tamaño del ancho y el alto de este elemento de la interfaz de usuario en píxeles?
Respuestas:
Pruebe el siguiente código:
fuente
navigation_bar_height_landscape
para la altura de la barra de navegación en modo horizontal ynavigation_bar_width
para el ancho de una barra de navegación vertical). Debe averiguar por separado si se muestra realmente la barra de navegación y dónde se muestra, por ejemplo, probando la presencia de un botón de menú físico. Quizás pueda encontrar alguna otra forma en el código fuente de Android en android.googlesource.com/platform/frameworks/base/+/…Obtengo el tamaño de la barra de navegación al comparar el tamaño de pantalla utilizable por la aplicación con el tamaño de pantalla real. Supongo que la barra de navegación está presente cuando el tamaño de la pantalla utilizable por la aplicación es menor que el tamaño real de la pantalla. Luego calculo el tamaño de la barra de navegación. Este método funciona con API 14 y posteriores.
ACTUALIZAR
Para obtener una solución que tenga en cuenta los recortes de pantalla, consulte la respuesta de John .
fuente
La altura de la barra de navegación varía para algunos dispositivos, pero también para algunas orientaciones. Primero debe verificar si el dispositivo tiene una barra de navegación, luego si el dispositivo es una tableta o no una tableta (teléfono) y finalmente debe mirar la orientación del dispositivo para obtener la altura correcta.
fuente
hasBackKey = false!
aunque debería ser cierto. Lo siguiente funcionó en su lugar:boolean navBarExists = getResources().getBoolean(getResources().getIdentifier("config_showNavigationBar", "bool", "android"));
En realidad, la barra de navegación de las tabletas (al menos Nexus 7) tiene un tamaño diferente en vertical y horizontal, por lo que esta función debería verse así:
fuente
context.getResources().getConfiguration().orientation
Creo que la mejor respuesta está aquí porque también te permite obtener una altura de corte uniforme.
Tome su vista raíz y agregue setOnApplyWindowInsetsListener (o puede anular onApplyWindowInsets de ella), y tome insets.getSystemWindowInsets de ella.
En la actividad de mi cámara, agrego un relleno igual al systemWindowInsetBottom a mi diseño inferior. Y finalmente, soluciona el problema del recorte.
con appcompat es así
sin appcompat, esto:
fuente
setOnApplyWindowInsetsListener
en su lugar? ¿Si es así, cómo? y ¿por qué diferenciaste entre LOLLIPOP y el resto?Espero que esto te ayude
fuente
Este es mi código para agregar paddingRight y paddingBottom a una vista para esquivar la barra de navegación. Combiné algunas de las respuestas aquí e hice una cláusula especial para la orientación horizontal junto con isInMultiWindowMode. La clave es leer navigation_bar_height , pero también verificar config_showNavigationBar para asegurarse de que realmente deberíamos usar la altura.
Ninguna de las soluciones anteriores funcionó para mí. A partir de Android 7.0, debe tener en cuenta el modo de ventana múltiple. Esto rompe las implementaciones que comparan display.realSize con display.size ya que realSize te da las dimensiones de toda la pantalla (ambas ventanas divididas) y size solo te da las dimensiones de la ventana de tu aplicación. Configurar el relleno a esta diferencia dejará toda la vista como relleno.
fuente
La altura de la barra de navegación inferior es 48 dp (tanto en modo vertical como horizontal) y 42 dp cuando la barra se coloca verticalmente.
fuente
La solución propuesta por Egidijus y funciona perfectamente para Build.VERSION.SDK_INT> = 17
Pero obtuve "NoSuchMethodException" durante la ejecución de la siguiente declaración con Build.VERSION.SDK_INT <17 en mi dispositivo:
He modificado el método getRealScreenSize () para tales casos:
fuente
Resolví este problema para todos los dispositivos (incluidos Nexus 5, Samsung Galaxy Nexus 6 edge +, Samsung S10, Samsung Note II, etc.). Creo que esto le ayudará a manejar los problemas que dependen del dispositivo.
Aquí estoy agregando dos tipos de códigos,
Código Java (para Android nativo):
Y código C # (para Xamarin Forms / Android)
fuente
Display.getRealMetrics()
requiere nivel de API 17screenOrientation
está predeterminado,hasPermanentMenuKey
esfalse
solo si no gira. [2] CuandoscreenOrientation
es un paisaje, cae endisplayMetrics.heightPixels != realDisplayMetrics.heightPixels)
otro. [3] CuandoscreenOrientation
es retrato,hasPermanentMenuKey
esfalse
.Combinando la respuesta de @egis y otros, esto funciona bien en una variedad de dispositivos, probado en Pixel EMU, Samsung S6, Sony Z3, Nexus 4. Este código usa las dimensiones de la pantalla para probar la disponibilidad de la barra de navegación y luego usa las tamaño de la barra de navegación del sistema, si está presente.
fuente
Cómo obtener la altura de la barra de navegación y la barra de estado. Este código me funciona en algunos dispositivos Huawei y Samsung . La solución de Egis anterior es buena, sin embargo, todavía es incorrecta en algunos dispositivos. Entonces, lo mejoré.
Este es el código para obtener la altura de la barra de estado.
Este método siempre devuelve la altura de la barra de navegación incluso cuando la barra de navegación está oculta.
NOTA: en Samsung A70, este método devuelve la altura de la barra de estado + la altura de la barra de navegación. En otros dispositivos (Huawei), solo devuelve la altura de la barra de navegación y devuelve 0 cuando la barra de navegación está oculta.
Este es el código para obtener la altura de la barra de navegación y la barra de estado
fuente
He hecho esto, funciona en todos los dispositivos que probé, e incluso en emuladores:
fuente
Así es como resolví esto. Hice una barra inferior ocultable que necesitaba relleno dependiendo de si había una barra de navegación o no (capacitiva, en pantalla o simplemente antes de la paleta).
Ver
Utils.java
fuente
En mi caso en el que quería tener algo como esto:
Tuve que seguir lo mismo que sugirió @Mdlc pero probablemente un poco más simple (apuntando solo > = 21):
También funciona en el paisaje:
Editar La solución anterior no funciona correctamente en el modo de ventanas múltiples donde el rectángulo utilizable no es más pequeño solo debido a la barra de navegación sino también debido al tamaño de ventana personalizado. Una cosa que noté es que en múltiples ventanas, la barra de navegación no se cierne sobre la aplicación, por lo que incluso sin cambios en el relleno de DecorView, tenemos el comportamiento correcto:
Tenga en cuenta la diferencia entre cómo la barra de navegación se desplaza sobre la parte inferior de la aplicación en estos escenarios. Afortunadamente, esto es fácil de solucionar. Podemos comprobar si la aplicación es multiventana. El siguiente código también incluye la parte para calcular y ajustar la posición de la barra de herramientas (solución completa: https://stackoverflow.com/a/14213035/477790 )
Resultado en el modo emergente de Samsung:
fuente
Código probado para obtener la altura de la barra de navegación (en píxeles):
Código probado para obtener la altura de la barra de estado (en píxeles):
Conversión de píxeles a dp:
fuente
En el caso de Samsung S8, ninguno de los métodos proporcionados anteriormente proporcionaba la altura adecuada de la barra de navegación, así que utilicé el proveedor de altura de teclado KeyboardHeightProvider android . Y me dio altura en valores negativos y para el posicionamiento de mi diseño ajusté ese valor en los cálculos.
Aqui esta
KeyboardHeightProvider.java
:popupwindow.xml
:Uso en
MainActivity
Para obtener más ayuda, puede echar un vistazo al uso avanzado de esto aquí .
fuente
Como se sugiere en muchas de las respuestas anteriores, por ejemplo
Es posible que simplemente obtener la altura de la barra de navegación no sea suficiente. Necesitamos considerar si 1. existe una barra de navegación, 2. está en la parte inferior, derecha o izquierda, 3. si la aplicación está abierta en modo de múltiples ventanas.
Afortunadamente, puede omitir fácilmente toda la codificación larga simplemente configurando
android:fitsSystemWindows="true"
su diseño raíz. El sistema Android se encargará automáticamente de agregar el relleno necesario al diseño raíz para asegurarse de que las vistas secundarias no entren en la barra de navegación o en las regiones de la barra de estado.Hay una solución simple de una línea
o programáticamente
también puede obtener la vista raíz por
Para obtener más detalles sobre cómo obtener la vista raíz, consulte: https://stackoverflow.com/a/4488149/9640177
fuente