Cuando se utiliza el modo de inmersión con diálogos, nav. Barra reaparece y cambia de tamaño mi diseño

Estoy utilizando el Modo Immersivo en mi aplicación cuando se ejecuta en Android 4.4 o superior. ( Http://developer.android.com/training/system-ui/immersive.html )

Mi actividad realmente se muestra en pantalla completa, y trabajo alrededor de la tecla de volumen presionando usando setOnSystemUiVisibilityChangeListener . También tengo código similar para poner cuadros de diálogo en modo inmersivo.

Sin embargo, cuando se muestra un cuadro de diálogo, el navegador. Barras saltar en la pantalla y luego retirarse inmediatamente. Cuando el diálogo se descarta es aún peor – el nav. Barras saltar y cambiar el tamaño de la actividad detrás.

La siguiente es mi clase para apoyar el modo de inmersión. Simplemente se llama a onResume de cada actividad y también se llama una función separada al construir cada cuadro de diálogo.

¿He perdido alguna bandera o devolución de llamada, o se trata de un problema conocido de Android?

 public class ImmersiveModeHelper { public ImmersiveModeHelper(Activity activity) { mActivity = activity; } @SuppressLint("NewApi") public void supportFullScreenImmersiveMode() { MyLog.d("ImmersiveModeHelper: supportFullScreenImmersiveMode: "); // Support full-screen immersive mode on Android 4.4 and up if (Build.VERSION.SDK_INT >= 19) { // Get the needed flags by reflection and use them try { final int immersiveFlag = View.class.getField("SYSTEM_UI_FLAG_IMMERSIVE_STICKY") .getInt(null); final int hideNavigationFlag = View.class .getField("SYSTEM_UI_FLAG_HIDE_NAVIGATION").getInt(null); final int fullScreenFlag = View.class.getField("SYSTEM_UI_FLAG_FULLSCREEN").getInt( null); // Set the flags to the window decor view mActivity.getWindow().getDecorView() .setSystemUiVisibility(immersiveFlag | hideNavigationFlag | fullScreenFlag); // Set a callback to be called when visibility changes // (workaround // for volume keys) mActivity .getWindow() .getDecorView() .setOnSystemUiVisibilityChangeListener( new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { MyLog.d("ImmersiveModeHelper.supportFullScreenImmersiveMode().new OnSystemUiVisibilityChangeListener() {...}: onSystemUiVisibilityChange: " + ""); if ((visibility & (immersiveFlag | hideNavigationFlag)) == 0) { Handler uiHandler = UiThreadUtils.getUiHandler(); uiHandler.removeCallbacks(mHideSystemUiCallback); uiHandler.postDelayed(mHideSystemUiCallback, HIDE_SYSTEM_UI_DELAY_MILLI); } } }); } catch (Exception e) { e.printStackTrace(); MyLog.e("ImmersiveModeHelper: supportFullScreenImmersiveMode: couldn't support immersive mode by reflection"); } } else { MyLog.i("ImmersiveModeHelper: supportFullScreenImmersiveMode: not supported on this platform version"); } } public static void supportFullScreenImmersiveModeForDialog(final Dialog dlg) { MyLog.d("ImmersiveModeHelper: supportFullScreenImmersiveModeForDialog: "); // Support full-screen immersive mode on Android 4.4 and up if (Build.VERSION.SDK_INT >= 19) { final Window dlgWindow = dlg.getWindow(); // Get the needed flags by reflection and use them try { final int immersiveFlag = View.class.getField("SYSTEM_UI_FLAG_IMMERSIVE_STICKY") .getInt(null); final int hideNavigationFlag = View.class .getField("SYSTEM_UI_FLAG_HIDE_NAVIGATION").getInt(null); final int fullScreenFlag = View.class.getField("SYSTEM_UI_FLAG_FULLSCREEN").getInt( null); // Set the flags to the window decor view int flags = dlgWindow.getDecorView().getSystemUiVisibility(); flags |= (immersiveFlag | hideNavigationFlag | fullScreenFlag); dlgWindow.getDecorView().setSystemUiVisibility(flags); // Set a callback to be called when visibility changes // (workaround for volume keys) dlgWindow.getDecorView().setOnSystemUiVisibilityChangeListener( new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { MyLog.d("ImmersiveModeHelper.supportFullScreenImmersiveModeForDialog(...).new OnSystemUiVisibilityChangeListener() {...}: onSystemUiVisibilityChange: "); if ((visibility & (immersiveFlag | hideNavigationFlag)) == 0) { Runnable hideSystemUiCallback = new Runnable() { @Override public void run() { supportFullScreenImmersiveModeForDialog(dlg); } }; Handler uiHandler = UiThreadUtils.getUiHandler(); uiHandler.removeCallbacks(hideSystemUiCallback); uiHandler.postDelayed(hideSystemUiCallback, HIDE_SYSTEM_UI_DELAY_MILLI); } } }); } catch (Exception e) { e.printStackTrace(); MyLog.e("ImmersiveModeHelper: supportFullScreenImmersiveMode: couldn't support immersive mode by reflection"); } } else { MyLog.i("ImmersiveModeHelper: supportFullScreenImmersiveMode: not supported on this platform version"); } } private Activity mActivity; private Runnable mHideSystemUiCallback = new Runnable() { @Override public void run() { supportFullScreenImmersiveMode(); } }; private static final int HIDE_SYSTEM_UI_DELAY_MILLI = 0; } 

Desde la API de Google: es recomendable incluir otros indicadores de interfaz de usuario del sistema (como SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION y SYSTEM_UI_FLAG_LAYOUT_STABLE) para evitar que el contenido cambie de tamaño cuando se oculta y se muestra el sistema.

También debe asegurarse de que la barra de acciones y otros controles de interfaz de usuario están ocultos al mismo tiempo. Este fragmento muestra cómo ocultar y mostrar el estado y las barras de navegación, sin cambiar el tamaño del contenido:

 // This snippet hides the system bars. private void hideSystemUI() { // Set the IMMERSIVE flag. // Set the content to appear under the system bars so that the content // doesn't resize when the system bars hide and show. mDecorView.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 // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | View.SYSTEM_UI_FLAG_IMMERSIVE); } // This snippet shows the system bars. It does this by removing all the flags // except for the ones that make the content appear under the system bars. private void showSystemUI() { mDecorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } 

Espero que esto ayude.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.