Nascondi la barra di stato

Questa lezione descrive come nascondere la barra di stato nelle diverse versioni di Android. Se nascondi la barra di stato (e, facoltativamente, la barra di navigazione) consenti ai contenuti di utilizzare una porzione maggiore dello spazio di visualizzazione, offrendo così un'esperienza utente più immersiva.

La figura 1 mostra un'app con una barra di stato visibile:

barre di sistema

Figura 1. Barra di stato visibile.

La figura 2 mostra un'app con la barra di stato nascosta. Tieni presente che anche la barra delle azioni è nascosta. Non devi mai mostrare la barra delle azioni senza la barra di stato.

barre di sistema

Figura 2. Barra di stato nascosta.

Nascondere la barra di stato su Android 4.0 e versioni precedenti

Puoi nascondere la barra di stato su Android 4.0 (livello API 14) e versioni precedenti impostando i flag WindowManager. Puoi farlo in modo programmatico o impostando un tema di attività nel file manifest dell'app. L'approccio preferito è l'impostazione di un tema di attività nel file manifest della tua app se la barra di stato deve rimanere sempre nascosta nell'app (sebbene, se vuoi, puoi eseguire l'override del tema in modo programmatico). Ecco alcuni esempi:

<application
    ...
    android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
    ...
</application>

I vantaggi dell'utilizzo di un tema di attività sono i seguenti:

  • È più facile da gestire e meno soggetto a errori rispetto all'impostazione di un flag in modo programmatico.
  • Questo comporta transizioni dell'interfaccia utente più fluide, perché il sistema dispone delle informazioni necessarie per eseguire il rendering della tua UI prima di creare un'istanza dell'attività principale dell'app.

In alternativa, puoi impostare in modo programmatico i flag WindowManager. Questo approccio consente di nascondere e mostrare più facilmente la barra di stato mentre l'utente interagisce con la tua app:

Kotlin

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN)
        }
        setContentView(R.layout.activity_main)
    }
    ...
}

Java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // If the Android version is lower than Jellybean, use this call to hide
        // the status bar.
        if (Build.VERSION.SDK_INT < 16) {
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
        setContentView(R.layout.activity_main);
    }
    ...
}

Quando imposti i flag WindowManager (tramite un tema di attività o in modo programmatico), questi rimangono attivi a meno che l'app non li cancelli.

Puoi usare FLAG_LAYOUT_IN_SCREEN per impostare il layout delle attività in modo che utilizzi la stessa area dello schermo disponibile dopo aver attivato FLAG_FULLSCREEN. In questo modo, i contenuti non verranno ridimensionati quando la barra di stato viene nascosta e visualizzata.

Nascondere la barra di stato su Android 4.1 e versioni successive

Puoi nascondere la barra di stato su Android 4.1 (livello API 16) e versioni successive utilizzando setSystemUiVisibility(). setSystemUiVisibility() imposta i flag UI a livello di singola vista; queste impostazioni vengono aggregate a livello di finestra. L'utilizzo di setSystemUiVisibility() per impostare i flag UI offre un controllo più granulare sulle barre di sistema rispetto all'uso dei flag WindowManager. Questo snippet nasconde la barra di stato:

Kotlin

// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
actionBar?.hide()

Java

View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();

Nota:

  • Una volta cancellati i flag UI (ad esempio, uscendo dall'attività), l'app deve reimpostarli se vuoi nascondere di nuovo le barre. Consulta la sezione Rispondere alle modifiche alla visibilità dell'interfaccia utente per una discussione su come rimanere in ascolto delle modifiche alla visibilità dell'interfaccia utente in modo che la tua app possa rispondere di conseguenza.
  • La scelta dei flag UI fa la differenza. Se nascondi le barre di sistema nel metodo onCreate() dell'attività e l'utente preme Home, le barre di sistema riappariranno. Quando l'utente riapre l'attività, onCreate() non verrà chiamato, quindi le barre di sistema rimarranno visibili. Se vuoi che le modifiche all'interfaccia utente di sistema vengano mantenute mentre l'utente entra ed esce dalla tua attività, imposta i flag UI in onResume() o onWindowFocusChanged().
  • Il metodo setSystemUiVisibility() ha effetto solo se la vista da cui lo chiami è visibile.
  • Se esci dalla visualizzazione, i flag impostati su setSystemUiVisibility() vengono cancellati.

Visualizzazione dei contenuti dietro la barra di stato

Su Android 4.1 e versioni successive, puoi impostare i contenuti dell'applicazione in modo che vengano visualizzati dietro la barra di stato, in modo che non vengano ridimensionati quando la barra di stato viene nascosta e visualizzata. Per farlo, utilizza SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Potresti anche dover utilizzare SYSTEM_UI_FLAG_LAYOUT_STABLE per fare in modo che la tua app mantenga un layout stabile.

Quando utilizzi questo approccio, è tua responsabilità assicurarti che le parti critiche dell'interfaccia utente dell'app (ad esempio i controlli integrati in un'applicazione Maps) non siano coperte da barre di sistema. Questa operazione potrebbe rendere inutilizzabile la tua app. Nella maggior parte dei casi, puoi risolvere questo problema aggiungendo l'attributo android:fitsSystemWindows al file di layout XML, impostato su true. In questo modo viene regolata la spaziatura interna dell'elemento ViewGroup principale in modo da lasciare spazio per le finestre di sistema. Questa opzione è sufficiente per la maggior parte delle applicazioni.

In alcuni casi, tuttavia, potrebbe essere necessario modificare la spaziatura interna predefinita per ottenere il layout desiderato per la tua app. Per manipolare direttamente la disposizione dei contenuti rispetto alle barre di sistema (che occupano uno spazio noto come "insiemi di contenuti" della finestra), sostituisci fitSystemWindows(Rect insets). Il metodo fitSystemWindows() viene richiamato dalla gerarchia delle visualizzazioni quando gli inserti di contenuti di una finestra sono cambiati, per consentire alla finestra di regolare il proprio contenuto di conseguenza. Se esegui l'override di questo metodo, puoi gestire i riquadri (e quindi il layout dell'app) come preferisci.