Nascondi la barra di stato

Questa lezione spiega come nascondere la barra di stato su diverse versioni di Android. Se nascondi la barra di stato (e, facoltativamente, anche la barra di navigazione) utilizzano più 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 una barra di stato nascosta. Tieni presente che anche la barra delle azioni è nascosta. Non dovresti mai mostrare la barra delle azioni senza la barra di stato.

barre di sistema

Figura 2. Barra di stato nascosta.

Nascondi 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 WindowManager flag. Puoi farlo in modo programmatico oppure impostare un tema di attività nel file manifest della tua app. L'impostazione di un tema di attività nell'app del file manifest è l'approccio preferito se la barra di stato deve rimanere nascosto nella tua app (anche se in realtà puoi sostituire in modo programmatico tema, se volessi). Ad esempio:

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

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

  • È più facile da gestire e meno soggetto a errori rispetto all'impostazione di un flag in modo programmatico.
  • Ciò si traduce in transizioni più fluide all'interfaccia utente perché il sistema dispone delle informazioni di cui ha bisogno per eseguire il rendering dell'UI prima di creare un'istanza per l'attività principale dell'app.

In alternativa, puoi impostare in modo programmatico i flag WindowManager. Questo approccio semplifica l'occultamento e la visualizzazione della barra di stato durante l'interazione dell'utente 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), i flag rimangono validi a meno che l'app non li cancelli.

Puoi utilizzare FLAG_LAYOUT_IN_SCREEN per impostare il layout delle attività in modo che utilizzi la stessa area dello schermo disponibile quando attivi FLAG_FULLSCREEN. In questo modo il ridimensionamento dei contenuti quando la barra di stato viene nascosta e visualizzata.

Nascondi 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 tramite utilizzando setSystemUiVisibility(). setSystemUiVisibility() imposta flag UI su a livello di singola vista; e queste impostazioni sono aggregate a livello di finestra. Utilizzo setSystemUiVisibility() per impostare i flag UI offre un controllo più granulare sulle barre di sistema rispetto all'uso WindowManager flag. 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 dell'interfaccia utente (ad esempio, uscendo attività), l'app dovrà reimpostarle se vuoi nascondere nuovamente le barre. Consulta l'articolo Risposta alle modifiche della visibilità nell'interfaccia utente per un discussione su come ascoltare le modifiche alla visibilità dell'interfaccia utente affinché la tua app devono rispondere di conseguenza.
  • Il punto in cui imposti i flag UI fa la differenza. Se nascondi le barre di sistema nella onCreate() e l'utente preme Home, le barre di sistema verranno riapparire. Quando l'utente riapre l'attività, onCreate() non verranno chiamati, quindi le barre di sistema rimarranno visibili. Se vuoi che vengano apportate modifiche all'interfaccia utente vengono mantenuti man mano che l'utente entra ed esce dalla tua attività, imposta i flag UI nelle onResume() o onWindowFocusChanged().
  • Il metodo setSystemUiVisibility() ha effetto solo se la vista da cui lo chiami è visibile.
  • L'uscita dalla visualizzazione causa flag imposta con setSystemUiVisibility() da cancellare.

Visualizzare i contenuti dietro la barra di stato

Su Android 4.1 e versioni successive, puoi impostare i contenuti della tua applicazione in modo che la barra di stato in modo che i contenuti non vengano ridimensionati mentre la barra di stato viene nascosta e visualizzata. A questo scopo, utilizza SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Potresti dover usare anche SYSTEM_UI_FLAG_LAYOUT_STABLE per aiutare la tua app a mantenere e stabile.

Quando utilizzi questo approccio, diventa tua responsabilità garantire che le parti critiche dell'interfaccia utente dell'app (ad esempio, i controlli integrati di un'applicazione Maps) essere coperta dalle barre di sistema. Questa operazione potrebbe rendere inutilizzabile la tua app. Nella maggior parte dei casi puoi per gestire la situazione 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. per lasciare spazio per le finestre di sistema. Questo è sufficiente per la maggior parte delle applicazioni.

In alcuni casi, tuttavia, potrebbe essere necessario modificare la spaziatura interna predefinita per ottenere layout della tua app. Per manipolare direttamente il modo in cui i contenuti si presentano rispetto alle barre di sistema (che occupano uno spazio noto come "insiemi di contenuti"), sostituisci fitSystemWindows(Rect insets). Il metodo fitSystemWindows() viene chiamato visualizzare la gerarchia quando i riquadri di contenuti di una finestra sono cambiati, per consentire alla finestra di ne modificano i contenuti di conseguenza. Se esegui l'override di questo metodo puoi gestire (e quindi il layout dell'app) in base alle tue esigenze.