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
- Android pantalla completa una actividad y ocultar la barra de teclas
- Android Studio Teclado Atajo para el modo de pantalla completa
- Transición suave entre la actividad de pantalla completa y una con barra de notificación y barra de acción
- Crear un diálogo transparente encima de la actividad
- La barra de acciones se muestra incorrectamente al volver del modo inmersivo
Después de presionar los botones de volumen o después de presionar dos veces las aplicaciones recientes
Vi la aplicación QuickPic no tiene este error. Me pregunto cómo lo omitieron.
- Cómo mostrar la imagenVer pantalla completa en la imagen¿Haga clic?
- Pantalla completa + barra de acción (Immersive)
- Android VideoView pantalla completa con controles de barra de navegación superpuestos
- La aplicación se bloquea al intentar ocultar la barra de título
- Ventana Popup de Android Pantalla completa
- El efecto de sombra superpuesto permanece en NavigationView del cajón de navegación
- Cómo configurar la actividad en modo de pantalla completa en Android?
- Haga un SurfaceView más grande que la pantalla (Ajuste de una vista previa de cámara a un SurfaceView más grande que la pantalla)
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:
- Al obtener el enfoque
- En onResume
- 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 ().