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()
?
android
fullscreen
navigationbar
Sujith Manjavana
fuente
fuente
Respuestas:
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
onCreate
ver setOnSystemUiVisibilityChangeListenerAquí hay otra pregunta relacionada:
La navegación en modo inmersivo se vuelve pegajosa después de presionar el volumen o minimizar-restaurar
fuente
android:fitsSystemWindows="true"
de sus vistas. Android Studio incluye este atributo al generar algunos diseños. Ver stackoverflow.com/a/42501330/650894Hacer 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 suonResume()
método.fuente
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.
fuente
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 bar
aparece 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
fuente
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 :
fuente
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);
fuente
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?
fuente
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);
fuente
Las otras respuestas usan principalmente las banderas para el
setSystemUiVisibility()
métodoView
. 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) } }
fuente
Prueba esto:
View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions);
fuente
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.
fuente