It's happening now, watch the livestream.

Cómo ocultar la barra de estado

En esta lección, se describe cómo ocultar la barra de estado en diferentes versiones de Android. Si ocultas la barra de estado (y, opcionalmente, la barra de navegación), permites que el contenido use más del espacio de visualización, lo que ofrece una experiencia del usuario más envolvente.

En la figura 1, se muestra una app con una barra de estado visible:

barras del sistema

Figura 1: Barra de estado visible

En la figura 2, se muestra una app con una barra de estado oculta. Ten en cuenta que la barra de acciones también está oculta. Nunca debes mostrar la barra de acciones sin la barra de estado.

barras del sistema

Figura 2: Barra de estado oculta

Cómo ocultar la barra de estado en Android 4.0 y versiones anteriores

Para ocultar la barra de estado en Android 4.0 (API nivel 14) y versiones anteriores, define marcas WindowManager. Puedes hacerlo de manera programática o definiendo un tema de actividad en el archivo de manifiesto de tu app. Establecer un tema de actividad en el archivo de manifiesto de tu app es el enfoque preferido si la barra de estado siempre debe permanecer oculta en tu app (aunque, en sentido estricto, puedes anular el tema de manera programática si así lo deseas). Por ejemplo:

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

Las ventajas de usar un tema de actividad son las siguientes:

  • Es más fácil de mantener y menos propenso a errores que establecer una marca de manera programática.
  • Genera transiciones de IU más fluidas, ya que el sistema cuenta con la información necesaria para procesar tu IU antes de crear la instancia de la actividad principal de tu app.

También puedes establecer marcas de WindowManager de manera programática. Este enfoque hace que sea más fácil ocultar y mostrar la barra de estado mientras el usuario interactúa con tu 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);
        }
        ...
    }
    

Cuando defines marcas de WindowManager (ya sea a través de un tema de actividad o de manera programática), las marcas permanecen vigentes, a menos que tu app las borre.

Puedes usar FLAG_LAYOUT_IN_SCREEN para definir que el diseño de tu actividad use la misma área de pantalla que está disponible cuando habilitaste FLAG_FULLSCREEN. De esta manera, evitas que tu contenido cambie de tamaño cuando la barra de estado se oculta y se muestra.

Cómo ocultar la barra de estado en Android 4.1 y versiones posteriores

Puedes usar setSystemUiVisibility() para ocultar la barra de estado en Android 4.1 (API nivel 16) y versiones posteriores. setSystemUiVisibility() establece marcas de IU en el nivel de vista individual. Estas opciones de configuración se agrupan a nivel de la ventana. Usa setSystemUiVisibility() para definir marcas de IU y obtén un control más detallado de las barras del sistema que usar marcas de WindowManager. Este fragmento oculta la barra de estado:

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

Ten en cuenta lo siguiente:

  • Una vez que se hayan borrado las marcas (por ejemplo, si te alejas de la actividad), tu app debe restablecerlas si deseas volver a ocultar las barras. Consulta Cómo responder a los cambios de visibilidad de la IU para acceder a información sobre cómo escuchar los cambios de visibilidad de la IU de manera que tu app pueda responder en consecuencia.
  • El lugar en el que estableces las marcas de la IU hace la diferencia. Si ocultas las barras del sistema en el método onCreate() de tu actividad y el usuario presiona "Inicio", las barras del sistema volverán a aparecer. Cuando el usuario vuelva a abrir la actividad, no se llamará a onCreate(), de manera que las barras del sistema permanecerán visibles. Si deseas que los cambios en la IU del sistema persistan aunque el usuario entre y salga de tu actividad, define marcas de la IU en onResume() o onWindowFocusChanged().
  • El método setSystemUiVisibility() solo tiene efecto si la vista desde la que lo llamas está visible.
  • Si te alejas de la vista, se borrarán las marcas definidas con setSystemUiVisibility().

Cómo hacer que el contenido aparezca detrás de la barra de estado

En Android 4.1 y versiones posteriores, puedes configurar el contenido de tus aplicaciones para que aparezca detrás de la barra de estado. De esta manera, el contenido no cambia de tamaño cuando se oculta y se muestra la barra de estado. Para ello, usa SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN. Es posible que también debas usar SYSTEM_UI_FLAG_LAYOUT_STABLE para ayudar a que tu app mantenga un diseño estable.

Cuando usas este enfoque, es tu responsabilidad garantizar que partes críticas de la IU de tu app (por ejemplo, los controles integrados en una aplicación de Maps) no terminen cubiertas por las barras del sistema. Esto podría hacer que tu app sea inutilizable. En la mayoría de los casos, puedes solucionarlo si agregas el atributo android:fitsSystemWindows, definido en true, a tu archivo de diseño XML. De esta manera, se ajusta el relleno del ViewGroup principal a fin de dejar espacio para las ventanas del sistema. Esta medida es suficiente para la mayoría de las aplicaciones.

Sin embargo, en algunos casos, es posible que debas modificar el relleno predeterminado a fin de conseguir el diseño deseado para tu app. Para controlar directamente cómo se presenta tu contenido en relación con las barras del sistema (que ocupan un espacio conocido como "inserciones de contenido" de la ventana), anula fitSystemWindows(Rect insets). La jerarquía de vistas llama al método fitSystemWindows() cuando las inserciones de contenido cambian a fin de permitir que la ventana ajuste su contenido en consecuencia. Si anulas este método, puedes controlar las inserciones (y, por lo tanto, el diseño de tu app) como tú quieras.