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. Ocultar la barra de estado (y, opcionalmente, la barra de navegación) permite que el contenido use más espacio de visualización, lo que proporciona 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

Puedes ocultar la barra de estado en Android 4.0 (nivel de API 14) y versiones anteriores configurando marcas WindowManager. Puedes hacerlo de manera programática o configurando un tema de actividad en el archivo de manifiesto de tu app. Configurar 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 la app (aunque, en sentido estricto, puedes anular el tema de manera programática si 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 tiene la información que necesita para renderizar tu IU antes de crear una instancia de la actividad principal de tu app.

También puedes establecer marcas de WindowManager de manera programática. Este enfoque facilita ocultar y mostrar la barra de estado a medida que 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 configuras 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 establecer que el diseño de tu actividad use la misma área de pantalla que está disponible cuando habilitas FLAG_FULLSCREEN. Esto evita 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 ocultar la barra de estado en Android 4.1 (nivel de API 16) y versiones posteriores con setSystemUiVisibility(). setSystemUiVisibility() establece marcas de IU en el nivel de vista individual. Estas opciones de configuración se agregan a nivel de la ventana. Usar setSystemUiVisibility() para establecer marcas de IU te brinda un control más detallado sobre las barras del sistema que usar las marcas 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 borran las marcas de IU (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 ver un análisis 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(), por lo que las barras del sistema permanecerán visibles. Si deseas que los cambios en la IU del sistema persistan a medida que el usuario entre en tu actividad y salga de ella, establece las 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 sales de la vista, se borrarán las marcas establecidas 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 tu aplicación para que aparezca detrás de la barra de estado, de modo que el contenido no cambie de tamaño cuando se oculte y se muestre 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 controlar esto agregando el atributo android:fitsSystemWindows a tu archivo de diseño XML, configurado como true. De esta manera, se ajusta el relleno del ViewGroup superior 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 padding predeterminado para obtener el diseño deseado para tu app. Para controlar directamente la distribución del 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 según corresponda. Si anulas este método, puedes controlar las inserciones (y, por lo tanto, el diseño de tu app) como quieras.