2012-06-14 14 views
10

Sto impostando la modalità "spegni" per la mia app Android quando è in esecuzione su telefoni e tablet recenti. Nel mio metodo onCreate(), ho aggiunto:Mantenimento della modalità "spegni" (View.setSystemUiVisibility) su tutti i riavvii

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

questo funziona meglio di quanto pensassi. Sul mio tablet Android 3.2 la barra di stato si avvia in modalità basso profilo (tutti i pulsanti sulla barra sono sostituiti da punti). Se interagisco con i pulsanti sulla barra diventerà normale, quindi tornerò alla modalità di basso profilo in seguito (ad es., Se controllo la finestra di configurazione/notifiche dalla barra di stato). Quindi sembra che questa sia più una proprietà della mia app che un "comando" per nascondere l'interfaccia utente direttamente.

Ci sono due casi d'angolo che non sono gestiti, però. Innanzitutto, se un utente tocca la barra di stato senza colpire nessuno dei punti, la barra diventa attiva. Non torna mai alla modalità di basso profilo finché l'utente non interagisce effettivamente con qualcosa sulla barra (ad esempio, esamina le notifiche o acquisisce uno screenshot). Quindi, se tornano a interagire con la mia app, la barra di stato non è più in modalità basso profilo. (Anche l'app Gallery ha questo problema, quindi forse non è solo per me.) Il secondo caso angolare è un resume dalla schermata di blocco. Se tocchi il pulsante di accensione per bloccare il tablet, quindi lo sblocco e riprendi l'app, la barra di stato è completamente visibile (e l'interazione con esso non cambia nulla). (L'app Gallery non presenta questo problema.)

Un paio di post sul blog suggeriscono che potrei impostare un gestore per ascoltare le modifiche alla visibilità dell'interfaccia utente del sistema e quindi nascondere l'interfaccia utente se diventa visibile. Come questo:

rootView.setOnSystemUiVisibilityChangeListener(
    new View.OnSystemUiVisibilityChangeListener() { 
    @Override 
    public void onSystemUiVisibilityChange(int visibility) { 
     if (visibility == View.STATUS_BAR_VISIBLE) { 
     game.flagUIIsVisible(); 
     } 
    } 
    }); 

Nel mio caso, il metodo sull'oggetto game imposta solo una bandiera dicendo che l'interfaccia utente è andato invisibile. Successivamente, se nella mia app sono presenti eventi di tocco (sono gestiti dallo stesso oggetto game) e questo flag è impostato, quindi richiamo di nuovo la chiamata STATUS_BAR_HIDDEN.

Tuttavia, con queste richiamate non c'è alcun impatto visibile sull'interfaccia utente. Posso vedere che il gestore di destra viene chiamato da alcuni messaggi di log, e posso vedere che il listener viene invocato.

Ho anche provato a richiamare la chiamata STATUS_BAR_HIDDEN nel mio percorso onResume, ma non ha fatto alcuna differenza.

Sto cercando informazioni sul fatto che si tratti di una sorta di bug noto o di suggerimenti su cosa potrebbe fare l'applicazione Galleria (supponendo che faccia qualcosa di diverso). Oppure suggerimenti per altre API da provare (o altri dettagli che potrebbero essere pertinenti).

Sto usando libGDX e la mia app ha solo una vista, quindi è piuttosto semplice. La vista è anche impostata per essere a schermo intero senza titolo di libGDX. Ho ottenuto il mio targetSdkVersion impostato su 15 nel mio manifest.

risposta

5

Ho il sospetto che ci sia un bug in Android 3.2, in quanto posso aggirare il problema resume-from-lock-screen riattivando la barra di stato prima di disabilitarlo in onResume. No OnSystemUiVisibilityChangeListener è necessario.

In particolare, nel mio onResume percorso ho codice come questo:

View rootView = getWindow().getDecorView(); 
rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); 
rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); 

La chiamata apparentemente inutili per rendere la barra di stato visibile, sembra per effettuare la chiamata successiva per rendere la barra di stato nascosto realmente funzionano dopo lo sblocco il dispositivo.

1

Questo fissa il mio 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); 
     } 
    } 
}); 

Grazie P.T.!

+0

+1, Questo risolto il mio problema troppo: D – Houssni

2

Android 4.2 qui, il Samsung tablet - le tue soluzioni non ha funzionato per me, io in realtà sono riusciti a fare questo con ValuAnimator licenziato subito dopo onSystemUiVisibilityChange, con onAnimationEnd ascoltatore

 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(); 

} 
Problemi correlati