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

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { this.getWindow().getDecorView().setSystemUiVisibility(getSystemUiFlags()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private static int getSystemUiFlags() { return View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; } } 

Después del primer inicio

Después del primer inicio

Después de presionar los botones de volumen o después de presionar dos veces las aplicaciones recientes

Introduzca aquí la descripción de la imagen

Vi la aplicación QuickPic no tiene este error. Me pregunto cómo lo omitieron.

En cuanto a mí, utilizo este código

 public void UiChangeListener() { 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( 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); } } }); } 

Y lo llamó onCreate. 🙂

Tuve el mismo problema, y ​​lo resolví con una solución sencilla. Aunque no pude encontrar la razón teórica de esta solución, pero funcionó para mí de todos modos.

Parece que cuando se presiona un botón de volumen, se borran las 'banderas' relacionadas con el 'modo de inmersión'. Y creo que es por eso que el modo de inmersión está desactivado y el modo de inmersión no se restaura automáticamente.

Por lo tanto, intenté fijar los "indicadores" después de presionar el botón del volumen con el objeto "runnable".

Por lo tanto, funciona así:

Modo de inmersión -> botón de volumen presionado (indicadores borrados) -> 500ms más tarde, el objeto ejecutable vuelve a establecer las banderas -> modo de inmersión restaurado

1. Primero, defina el objeto ejecutable para establecer las banderas

 private Runnable decor_view_settings = new Runnable() { public void run() { 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); } }; 

2. Coloque el objeto que se ejecuta con algún retraso en un manejador cuando se presione un botón de volumen

 private Handler mHandler = new Handler(); 

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK) { finish(); } else if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { mHandler.postDelayed(decor_view_settings, 500); } return super.onKeyDown(keyCode, event); } 

Sólo lo retrasé por 500ms sin razón, no es importante.

3. El código básico para el modo inmersivo con objeto ejecutable

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(hasFocus) { mHandler.post(decor_view_settings); } } 

Funcionó perfectamente en mi aplicación.

Por lo tanto, cuando presiono un botón de volumen, el modo de inmersión está deshabilitado y el volumen del balancín aparece.

Después de unos segundos, el botón de volumen desaparece y también lo hace la barra de estado y la barra de navegación.

Espero que este trabajo para usted.

Mi solución es establecer los indicadores de Visibilidad de la interfaz de usuario en tres lugares:

  1. Al obtener el enfoque
  2. En onResume
  3. En el listener OnSystemUiVisibilityChangeListener

El tercero resolvió mi problema. Los otros tal vez no sean necesarios, pero los dejé. Esto es lo que parece:

  private void setupMainWindowDisplayMode() { View decorView = setSystemUiVisilityMode(); decorView.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { setSystemUiVisilityMode(); // Needed to avoid exiting immersive_sticky when keyboard is displayed } }); } private View setSystemUiVisilityMode() { View decorView = getWindow().getDecorView(); int options; options = 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 // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; decorView.setSystemUiVisibility(options); return decorView; } 

SetupMainWindowDisplayMode () se llama en onCreate ().

  • SetSystemUiVisibility (SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) no funciona
  • Cambio de la pantalla completa a la no pantalla completa pop / diapositiva
  • Uso de la actividad de pantalla completa
  • Utilizar SystemUiHider para mantener la barra de navegación oculta
  • La notificación de pantalla completa solo se muestra como un Heads Up
  • Aplicación de pantalla completa android
  • Haciendo que una aplicación de Android funcione a pantalla completa y paisaje
  • Dibujar sobre la barra de navegación (y otras aplicaciones) en la versión de Android> = 5
  • Los controles de vídeo HTML5 desaparecen en modo de pantalla completa en dispositivos Android
  • Immersive como característica en JB y ICS
  • Actividad de pantalla completa en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.