2012-06-14 16 views
10

Estoy configurando el modo "apagado" para mi aplicación de Android cuando se está ejecutando en teléfonos y tabletas recientes. En mi método onCreate(), agregué:Mantenimiento del modo "luces apagadas" (View.setSystemUiVisibility) en reinicios

View rootView = getWindow().getDecorView(); 
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); // aka View.SYSTEM_UI_FLAG_LOW_PROFILE 

esto funciona mejor de lo que pensaba. En mi tableta Android 3.2, la barra de estado se inicia en modo de perfil bajo (todos los botones de la barra se reemplazan por puntos). Si interactúo con los botones en la barra, se volverá normal y luego volveré al modo de perfil bajo después (por ejemplo, si reviso la ventana de configuración/notificaciones desde la barra de estado). Por lo tanto, parece que esto es más una propiedad de mi aplicación que un "comando" para ocultar la interfaz de usuario directamente.

Sin embargo, hay dos cajas de esquina que no se manejan. Primero, si un usuario toca la barra de estado sin tocar ninguno de los puntos, la barra se activa. Nunca regresa al modo de perfil bajo hasta que el usuario realmente interactúa con algo en la barra (por ejemplo, mira las notificaciones o toma una captura de pantalla). Entonces, si vuelven a interactuar con mi aplicación, la barra de estado ya no está en el modo de bajo perfil. (La aplicación de la Galería parece tener este problema también, así que tal vez no sea solo yo). El segundo caso de la esquina es un resumen de la pantalla de bloqueo. Si presiono el botón de encendido para bloquear la tableta, luego lo desbloqueo y reinicio la aplicación, la barra de estado es completamente visible (y la interacción con ella no cambia nada). (La aplicación Gallery no tiene este problema)

Un par de publicaciones en el blog sugieren que podría configurar un controlador para escuchar los cambios de visibilidad de la interfaz del sistema y luego volver a ocultar la interfaz de usuario si se vuelve visible. De esta manera:

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 game simplemente establece un indicador que dice la interfaz de usuario fue invisible. Más tarde, si hay algún evento táctil dentro de mi aplicación (están manejados por el mismo objeto game), y este indicador está configurado, invoco nuevamente la llamada STATUS_BAR_HIDDEN.

Sin embargo, con estas devoluciones de llamada no hay impacto visible en la interfaz de usuario. Puedo ver que se está llamando al controlador derecho desde algunos mensajes de registro, y puedo ver que se está invocando al oyente.

También intenté invocar la llamada STATUS_BAR_HIDDEN en mi ruta onResume, pero tampoco marcó la diferencia.

Estoy buscando información de que esto es algún tipo de error conocido, o insinúa lo que podría estar haciendo la aplicación de la Galería (suponiendo que está haciendo algo diferente). O sugerencias para probar otras API (u otros detalles que puedan ser relevantes).

Estoy usando libGDX, y mi aplicación solo tiene una vista, por lo que es bastante simple. La vista también está configurada para ser pantalla completa sin título por libGDX. Tengo mi targetSdkVersion establecido en 15 en mi manifiesto.

Respuesta

5

Sospecho que hay un error en Android 3.2, ya que puedo solucionar el problema de la reanudación de la pantalla de bloqueo volviendo a habilitar la barra de estado antes de deshabilitarla en onResume. No es necesario OnSystemUiVisibilityChangeListener.

En concreto, 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 innecesario hacer la barra de estado visible, parece hacer la llamada posterior para que la barra de estado oculta en realidad el trabajo después de desbloquear el dispositivo.

1

que esto esté arreglado 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 P. T.!

+0

+1, esta fijado mi problema también: D – Houssni

2

Android 4.2 aquí, en la tableta de Samsung - sus soluciones no funcionaron para mí, en realidad logró hacer esto con ValuAnimator despedido 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(); 

} 
Cuestiones relacionadas