android - studio - Detecta Visibilidad de la barra de estado/TYPE_SYSTEM_OVERLAY no cambia el tamaño automáticamente
setmargins android (2)
Creo que este puede ser el mismo problema con la ocultación de la barra de título en las ventanas de diálogo donde el sistema establece la visibilidad como oculta en lugar de desaparecida. Esto hace que la ventana de diálogo se centre incorrectamente.
Para eso, así es como lo soluciono. Esto podría funcionar para su situación, pero es posible que deba ajustarlo para el nombre del identificador de la barra de estado.
Window window = dialog.getWindow();
View view = window.getDecorView();
int topPanelId = getResources().getIdentifier("topPanel", "id", "android");
LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
topPanel.setVisibility(View.GONE);
Estoy utilizando el bien conocido método TYPE_SYSTEM_OVERLAY
para crear una superposición de pantalla completa que siempre está encima de otras vistas.
En Moto Atrix2 API15
y para cada AVD
de API 10
a 17
la vista de superposición cambia de tamaño automáticamente (se expande verticalmente) cuando la barra de estado está oculta por otra aplicación. La superposición parece "mantenerse en la parte superior" de todas las otras vistas, como creo que debería. Cuando la barra de estado vuelve a estar a la vista, la superposición reduce su tamaño automáticamente (menos píxeles verticales, básicamente restando la altura de la barra de estado).
Este es el comportamiento deseado y me inclino a pensar que esta no es la excepción o el comportamiento defectuoso debido a que funciona en muchos emuladores diferentes, así como al menos un fabricante de dispositivos ( motorola ), tal vez más, pero no tengo acceso a addtl devices.
El problema: en un Samsung GS2 (API15)
y también probado en Kindle Fire (API10?)
, La superposición no Kindle Fire (API10?)
automáticamente de tamaño (llena el espacio donde estaba la barra de estado) cuando la barra de estado está oculta por otra aplicación (barra de estado detrás de la aplicación de pantalla completa). En estos dispositivos, después de que se crea la vista la primera vez, no obtengo más eventos de una anulación onSizeChanged para la vista.
Aquí está el código pertinente:
params = new WindowManager.LayoutParams(
1, WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSPARENT);
wm.addView(sizeLayout, params);
sizeLayout tiene la anulación onSizeChanged.
He jugado con casi todos los windowmanager
layoutparam
que puedo encontrar, incluyendo SYSTEM_ALERT, FLAG_LAYOUT_IN_SCREEN, etc. ¡No dormiré hasta que pueda resolver esto!
Editar 30/11/12 : Encontré esto en @deviant: https://stackoverflow.com/a/9195733/1851478 que es básicamente lo que estoy haciendo, sin embargo, el problema persiste con ciertos dispositivos que no cambian el tamaño de system_overlay automáticamente. Tal vez debería plantear un error.
Más INFORMACIÓN: SI fuerzo un redibujado (o incluso solo cargo la aplicación de superposición) mientras hay una aplicación de pantalla completa en la parte superior del árbol de vista, mi superposición aún no dibuja sobre el espacio que normalmente ocupa la barra de estado (aunque la barra de estado no está a la vista en el momento del sorteo), así que parece que la superposición no está "superpuesta" en la parte superior de la ventana que está a pantalla completa (y he creado y probado muchas aplicaciones de pantalla completa usando una variedad de métodos para hacerlos ir a pantalla completa). En estos dispositivos, la única forma de hacer que la superposición dibuje sobre la barra de estado (incluso si la barra de estado no está a la vista) es usar el indicador FLAG_LAYOUT_IN_SCREEN
, pero el tamaño del diseño nunca cambia, siempre está a pantalla completa, y así volvemos al problema original de por qué esto funciona en algunos dispositivos pero no en otros.
Editar 12/12/12 : Así que no he tenido más suerte con esto, y traté de usar getLocalVisibleRect en las vistas, pero lamentablemente dado que mi aplicación no es propietaria de las vistas SystemUI no puede detectar lo que está debajo de las superposiciones. Supongo que con una ROM personalizada podría hacerlo, pero necesito una solución sin root.
Veo que otras aplicaciones en el mercado están teniendo el mismo problema al detectar la barra de estado en los teléfonos no operativos que mencioné anteriormente. Ejemplo: herramienta genial, barra de estado omega y barra de estado +. Bounty elevado.
Editar 12/19/12 Imágenes añadidas. Tenga en cuenta que en un dispositivo en funcionamiento, el área gris también "cubre" el área negra (cualquier aplicación que esté actualmente en pantalla completa), el área negra cubre toda la pantalla, solo muestro el área gris como mi superposición, aunque también es pantalla completa (menos o más la altura de la barra de estado dependiendo del dispositivo en funcionamiento / no operativo y si está a la vista o no).
Espero comprender lo que buscas aquí, pero en mi aplicación (TEAM BatteryBar) tuve un problema similar. (sin permisos mínimos de root)
No pude detectar una pantalla completa en nada debajo de API11 (e intermitente en algunos dispositivos (principalmente Samsung) sobre API11). Así que hice un oyente personalizado para él agregando un segundo diseño al WindowManager con un param de diseño diferente, luego anulé el onLayout para verificar si el statusBar todavía está allí o no, al verificar el tamaño de la ventana. desde allí puede hacer lo que necesite para su vista principal.
Iba a ponerlo en orden, pero funcionó, así que no: el código P tiene más de un año y es desde cuando empecé a codificar para Android, así que sí. Comida para pensar tho. Espero eso ayude.
aquí está el código en un repositorio en mi github con una copia pegar directamente de mi aplicación sobre cómo lo estoy usando. pequeño fragmento aquí
wm.addView(sizeLayout, params);// add your view
// then add the next one
Screendetect mDetector;
mDetector = new Screendetect(this);
mDetector.setOnFullScreenListener(new OnFullScreenListener() {
@Override
public void fsChanged(boolean FS_Bool) {
// TODO rethink this to be better.... bit hacky...
if (FS_Bool) {
Log.d("battbardetect", "Statusbar hidden");
FS_vissible(); // do what ever you need to
} else if (!FS_Bool) {
Log.d("battbardetect", "Statusbar Vissible");
FS_hidden(); // do what ever you need to
}
}
});
wm.addView(mDetector, params);