Mantenimiento del modo de "apagado de luces" (View.setSystemUiVisibility) a través de reinicios
Estoy configurando el modo "luces apagadas" para mi aplicación Android cuando esté funcionando en teléfonos y tablets recientes. En mi método onCreate (), agregué:
View rootView = getWindow().getDecorView(); rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); // aka View.SYSTEM_UI_FLAG_LOW_PROFILE
Esto funciona mejor de lo que pensé que sería. En mi tableta Android 3.2, la barra de estado comienza en modo de perfil bajo (todos los botones de la barra se reemplazan con puntos). Si interactúo con los botones de la barra, se volverá normal y luego volveré al modo de perfil bajo después (por ejemplo, si compruebo la ventana de configuración / notificaciones de la barra de estado). Así que parece que esto es más una propiedad de mi aplicación que un "comando" para ocultar la interfaz de usuario directamente.
Hay dos casos de esquina que no se manejan, sin embargo. En primer lugar, si un usuario pulsa la barra de estado sin pulsar ninguno de los puntos, la barra se activa. Nunca vuelve al modo de perfil bajo hasta que el usuario interactúa con algo en la barra (por ejemplo, mira las notificaciones o toma una captura de pantalla). Por lo tanto, si vuelven a interactuar con mi aplicación, la barra de estado ya no está en modo de perfil bajo. (La aplicación de Galería parece tener este problema, también, así que tal vez no sólo yo.) El segundo caso de la esquina es un curriculum vitae de la pantalla de bloqueo. Si presiono el botón de encendido para bloquear la tableta, desbloquearla y reanudarla, la barra de estado estará completamente visible (y la interacción con ella no cambia nada). (La aplicación Galería no tiene este problema.)
Un par de entradas de blog sugieren que podría establecer un controlador para escuchar los cambios de visibilidad de la interfaz de usuario del sistema y, a continuación, volver a ocultar la interfaz de usuario si se hace visible. Me gusta esto:
rootView.setOnSystemUiVisibilityChangeListener( new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if (visibility == View.STATUS_BAR_VISIBLE) { game.flagUIIsVisible(); } } });
En mi caso, el método en el objeto de game
sólo establece una bandera diciendo que la interfaz de usuario se hizo invisible. Más tarde, si hay algún evento táctil dentro de mi aplicación (que es manejado por el mismo objeto de game
), y este indicador se establece, invoco la llamada STATUS_BAR_HIDDEN de nuevo.
Sin embargo, con estas devoluciones de llamada no hay ningún impacto visibile en la interfaz de usuario. Puedo ver que el manejador derecho se está llamando de algunos mensajes del registro, y puedo ver que el oyente está siendo invocado.
También intenté invocar la llamada STATUS_BAR_HIDDEN en mi ruta onResume
, pero eso tampoco onResume
diferencia.
Estoy buscando información de que se trata de algún tipo de error conocido, o sugerencias para lo que la aplicación de Galería podría estar haciendo (suponiendo que está haciendo algo diferente). O sugerencias para otras APIs para probar (u otros detalles que puedan ser relevantes).
Estoy utilizando libGDX, y mi aplicación sólo tiene una vista, por lo que es bastante simple. La vista también está configurada para ser de pantalla completa sin título por libGDX. Tengo mi targetSdkVersion establecido en 15 en mi manifiesto.
Sospecho que hay un error en Android 3.2, ya que puedo trabajar en torno al problema de reanudar desde bloqueo de pantalla al volver a habilitar la barra de estado antes de deshabilitarlo en onResume
. No se necesita OnSystemUiVisibilityChangeListener
.
Específicamente, en mi camino onResume
tengo código como este:
View rootView = getWindow().getDecorView(); rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN);
La llamada aparentemente innecesaria para hacer la barra de estado visible, parece hacer la llamada subsiguiente para que la barra de estado ocultada realmente funcione después de desbloquear el dispositivo.
Android 4.2 aquí, en la tableta de Samsung – sus soluciones no funcionaron para mí, en realidad logré hacer esto con ValuAnimator disparado justo después onSystemUiVisibilityChange, con onAnimationEnd oyente
topView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { hideMenu(); } }); private void hideMenu(){ ValueAnimator hideAnim = ValueAnimator.ofInt(1,2); hideAnim.setDuration(1); hideAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { topView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); } }); hideAnim.start(); }
Esto solucionó mi problema:
rootView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if (visibility == View.SYSTEM_UI_FLAG_VISIBLE) { rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); rootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); } } });
Gracias PT!