¿Cómo ocultar la barra de navegación de forma permanente en la actividad de Android?

80

Quiero ocultar la barra de navegación de forma permanente en mi actividad (no en la interfaz de usuario de todo el sistema). ahora estoy usando este fragmento de código

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

Oculta la barra pero cuando el usuario toca la pantalla vuelve a mostrarse. ¿Hay alguna forma de ocultarlo permanentemente hasta que se active onStop()?

Sujith Manjavana
fuente
Aquí se presentan muchos detalles buenos y específicos, en este enlace oficial de Google / Android: Habilite el modo de pantalla completa .
Chris Sprague
La bandera se borró automáticamente cuando el usuario tocó la pantalla de acuerdo con la documentación. Debe realizar cambios en el diseño de su interfaz de usuario para ocultar la barra de navegación todo el tiempo.
user1154390

Respuestas:

118

Fragmentos:

FullScreenFragment.java

HideNavigationBarComponent.java


Esto es para Android 4.4+

Pruebe el modo inmersivo https://developer.android.com/training/system-ui/immersive.html

Fragmento rápido (para una clase de actividad ):

private int currentApiVersion;

@Override
@SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    currentApiVersion = android.os.Build.VERSION.SDK_INT;

    final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        | View.SYSTEM_UI_FLAG_FULLSCREEN
        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

    // This work only for android 4.4+
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT)
    {

        getWindow().getDecorView().setSystemUiVisibility(flags);

        // Code below is to handle presses of Volume up or Volume down.
        // Without this, after pressing volume buttons, the navigation bar will
        // show up and won't hide
        final View decorView = getWindow().getDecorView();
        decorView
            .setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
            {

                @Override
                public void onSystemUiVisibilityChange(int visibility)
                {
                    if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
                    {
                        decorView.setSystemUiVisibility(flags);
                    }
                }
            });
    }

}


@SuppressLint("NewApi")
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    if(currentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus)
    {
        getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

Si tiene problemas al presionar Subir volumen o Bajar volumen, aparecerá la barra de navegación. Agregué código en onCreatever setOnSystemUiVisibilityChangeListener

Aquí hay otra pregunta relacionada:

La navegación en modo inmersivo se vuelve pegajosa después de presionar el volumen o minimizar-restaurar

Dawid Drozd
fuente
4
Cuando el usuario desliza la parte superior / inferior de la pantalla, se mostrarán las barras de navegación semitransparentes que aparecerán temporalmente y luego se ocultarán nuevamente. ¿ES POSIBLE OCULTAR ESO TAMBIÉN?
Finder
@KarthickRamu Encontré una manera, solo mira mi respuesta :)
Muhammed Refaat
1
@MuhammedRefaat Tu pista necesita un dispositivo rooteado :(
Finder
1
@DawidDrozd Gracias, pero tengo un problema, el diseño de la raíz de mi actividad es RelativeLayout, y tiene una vista secundaria configurada android: layout_alignParentBottom = "true", la barra de navegación desaparece pero la vista secundaria no se mueve al borde inferior de la pantalla, como si la barra de navegación estuviera configurada como invisible no desaparecida, ¿podría ayudarme?
Jack
1
Si desea hacer uso del espacio que ocupaba la barra de navegación, debe eliminar todas las apariciones de android:fitsSystemWindows="true"de sus vistas. Android Studio incluye este atributo al generar algunos diseños. Ver stackoverflow.com/a/42501330/650894
Joe Lapp
65

Hacer esto.

public void FullScreencall() {
    if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
        View v = this.getWindow().getDecorView();
        v.setSystemUiVisibility(View.GONE);
    } else if(Build.VERSION.SDK_INT >= 19) {
        //for new api versions.
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

Esto funciona al 100% y puede hacer lo mismo para versiones de API inferiores, incluso si es una respuesta tardía, espero que ayude a otra persona.

Si desea que esto sea permanente, simplemente llame FullscreenCall()dentro de su onResume()método.

Evish Verma
fuente
2
Recomiendo echar un vistazo a developer.android.com/training/system-ui/immersive.html , que explica que su método simplemente oculta la barra hasta que haya interacción y nuevamente poco después de que se complete la interacción.
Carrito abandonado
Muchas gracias - ¡Eso fue todo! : D: +1
Christopher Stock
7

Para las personas que buscan una solución más simple, creo que pueden tener esta línea de código en onStart()

  getWindow().getDecorView().setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

Se llama modo inmersivo. Puede consultar la documentación oficial para ver otras posibilidades.

Harsha Vardhan
fuente
Recibo un error (no puedo encontrar el símbolo View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);) `` `@Override protected void onStart () {getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_HIDE_NAVIGATION_MIERS_FLAG_HIDE_NAVIGATION_FLIVE_SYSTEM_ super.onStart (); } `` `
Bilal Yaqoob
4

Según el sitio de desarrolladores de Android

Creo que no puedes (que yo sepa) ocultar la barra de navegación de forma permanente.

Sin embargo, puedes hacer un truco. Es un truco, fíjate.

Justo cuando navigation baraparece cuando el usuario toca la pantalla. Escóndelo inmediatamente de nuevo. Es divertido.

Compruebe esto .

void setNavVisibility(boolean visible) {
int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        | SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (!visible) {
    newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
            | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}

// If we are now visible, schedule a timer for us to go invisible.
if (visible) {
    Handler h = getHandler();
    if (h != null) {
        h.removeCallbacks(mNavHider);
        if (!mMenusOpen && !mPaused) {
            // If the menus are open or play is paused, we will not auto-hide.
            h.postDelayed(mNavHider, 1500);
        }
    }
}

// Set the new desired visibility.
setSystemUiVisibility(newVis);
mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);
mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE);
mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);
}

Vea esto para obtener más información sobre esto ...

Ocultar barra de sistema en tabletas

Sandeep R
fuente
3

Utilizar:-

view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

En tabletas con Android 4+, no es posible ocultar la barra de navegación / sistema.

De la documentación :

SYSTEM_UI_FLAG_HIDE_NAVIGATION es una nueva bandera que solicita que la barra de navegación se oculte por completo. Tenga en cuenta que esto solo funciona para la barra de navegación utilizada por algunos teléfonos (no oculta la barra del sistema en tabletas).

Namrata
fuente
2

Es mi solución:

Primero, defina un booleano que indique si la barra de navegación está visible o no.

boolean navigationBarVisibility = true //because it's visible when activity is created

Segundo método de creación que oculta la barra de navegación.

private void setNavigationBarVisibility(boolean visibility){
    if(visibility){
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
        navigationBarVisibility = false;
    }

    else
        navigationBarVisibility = true;
}

De forma predeterminada, si hace clic en la actividad después de ocultar la barra de navegación, la barra de navegación será visible. Así que tenemos su estado si es visible, lo ocultaremos.

Ahora configure OnClickListener en su vista. Yo uso una vista de superficie, así que para mí:

    playerSurface.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setNavigationBarVisibility(navigationBarVisibility);
        }
    });

Además, debemos llamar a este método cuando se inicia la actividad. Porque queremos esconderlo al principio.

        setNavigationBarVisibility(navigationBarVisibility);
PeerNet
fuente
2

Es un problema de seguridad: https://stackoverflow.com/a/12605313/1303691

por lo tanto, no es posible ocultar la navegación en una tableta de forma permanente con una sola llamada al comienzo de la creación de la vista. Se ocultará, pero aparecerá al tocar la pantalla. Entonces, solo el segundo toque en su pantalla puede causar un onClickEvent en su diseño. Por lo tanto, debe interceptar esta llamada, pero aún no la he logrado, actualizaré mi respuesta cuando me entere. ¿O ya tienes la respuesta?

swisscoder
fuente
1

Creo que el código de golpe lo ayudará y agregue ese código antes de setContentView ()

getWindow().setFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

Agregue ese código detrás de setContentView () getWindow (). GetDecorView (). SetSystemUiVisibility (View.SYSTEM_UI_FLAG_LOW_PROFILE);

canción de qingfei
fuente
1
El campo requiere API nivel 21+
zackygaurav
1

Las otras respuestas usan principalmente las banderas para el setSystemUiVisibility()método View. Sin embargo, esta API está obsoleta desde Android 11. Consulte mi artículo sobre cómo modificar la visibilidad de la interfaz de usuario del sistema para obtener más información. El artículo también explica cómo manejar los recortes correctamente o cómo escuchar los cambios de visibilidad.

Aquí hay fragmentos de código para mostrar / ocultar barras del sistema con la nueva API, así como la obsoleta para compatibilidad con versiones anteriores:

/**
 * Hides the system bars and makes the Activity "fullscreen". If this should be the default
 * state it should be called from [Activity.onWindowFocusChanged] if hasFocus is true.
 * It is also recommended to take care of cutout areas. The default behavior is that the app shows
 * in the cutout area in portrait mode if not in fullscreen mode. This can cause "jumping" if the
 * user swipes a system bar to show it. It is recommended to set [WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER],
 * call [showBelowCutout] from [Activity.onCreate]
 * (see [Android Developers article about cutouts](https://developer.android.com/guide/topics/display-cutout#never_render_content_in_the_display_cutout_area)).
 * @see showSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.hideSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.let {
            // Default behavior is that if navigation bar is hidden, the system will "steal" touches
            // and show it again upon user's touch. We just want the user to be able to show the
            // navigation bar by swipe, touches are handled by custom code -> change system bar behavior.
            // Alternative to deprecated SYSTEM_UI_FLAG_IMMERSIVE.
            it.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            // make navigation bar translucent (alternative to deprecated
            // WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
            // - do this already in hideSystemUI() so that the bar
            // is translucent if user swipes it up
            window.navigationBarColor = getColor(R.color.internal_black_semitransparent_light)
            // Finally, hide the system bars, alternative to View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            // and SYSTEM_UI_FLAG_FULLSCREEN.
            it.hide(WindowInsets.Type.systemBars())
        }
    } else {
        // Enables regular immersive mode.
        // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
        // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                // Do not let system steal touches for showing the navigation bar
                View.SYSTEM_UI_FLAG_IMMERSIVE
                        // Hide the nav bar and status bar
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_FULLSCREEN
                        // Keep the app content behind the bars even if user swipes them up
                        or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        // make navbar translucent - do this already in hideSystemUI() so that the bar
        // is translucent if user swipes it up
        @Suppress("DEPRECATION")
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
    }
}

/**
 * Shows the system bars and returns back from fullscreen.
 * @see hideSystemUI
 * @see addSystemUIVisibilityListener
 */
fun Activity.showSystemUI() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        // show app content in fullscreen, i. e. behind the bars when they are shown (alternative to
        // deprecated View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION and View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
        window.setDecorFitsSystemWindows(false)
        // finally, show the system bars
        window.insetsController?.show(WindowInsets.Type.systemBars())
    } else {
        // Shows the system bars by removing all the flags
        // except for the ones that make the content appear under the system bars.
        @Suppress("DEPRECATION")
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    }
}
Miloš Černilovský
fuente
Probé sus códigos con la bandera BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE en el emulador, pero la barra de navegación aparecerá y permanecerá visible cuando toque la pantalla. ¿Alguna idea de qué más debo configurar para obtener la funcionalidad STICKY en Android 11?
Angel Koh
@AngelKoh Tienes que llamar a hideSystemUI () manualmente si quieres ocultarlo. Consulte el artículo mencionado en mi respuesta, contiene todos estos detalles. El modo fijo significa que las barras serán transparentes si el usuario las desliza hacia arriba y la aplicación también recibirá los eventos táctiles (consulte developer.android.com/training/system-ui/… ).
Miloš Černilovský
sí, se llama a hideSystemUI () y la Ui se ocultó la primera vez. sin embargo, cuando toco la pantalla después, la barra de navegación vuelve a aparecer y permanece visible.
Angel Koh
El propósito de BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE es evitar que el sistema robe toques y muestre las barras. Así que no estoy seguro de qué podría causar esto sin ver / depurar la aplicación real.
Miloš Černilovský
0

Prueba esto:

View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
          | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
Rashad
fuente
NO, me da el mismo resultado
Sujith Manjavana
0

Creo que este código resolverá tu problema. Copie y pegue este código en su MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {                          
    super.onCreate(savedInstanceState);

    View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener
    (new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {

            if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                hideNavigationBar();
            } 
        }
    });
}



private void hideNavigationBar() {
   getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION|
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}

Funcionará en Android-10. Espero que ayude.

Sabarulla
fuente