При использовании режима Immersive с диалогими, nav. Bar снова появляется и меняет размеры моего макета

Я использую Immersive Mode в своем приложении, когда он работает на Android 4.4+. ( Http://developer.android.com/training/system-ui/immersive.html )

Моя активность действительно отображается в полноэкранном режиме, и я работаю над нажатием клавиши громкости с помощью setOnSystemUiVisibilityChangeListener . У меня также есть аналогичный код для ввода диалогов в режим погружения.

Однако, когда отображается диалог, навигация. Бары прыгают на экран, а затем отступают немедленно. Когда диалог отклоняется, это еще хуже – навигация. Бары прыгают и изменяют размер активности.

Ниже приведен мой класс для поддержки режима погружения. Он просто вызывается для каждого действия ActivityResume, а также при создании каждого диалога вызывается отдельная функция.

Я пропустил какой-либо флаг или обратный вызов, или это известная проблема с 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; } 

Из API Google. Хорошей практикой является использование других флагов пользовательского интерфейса системы (таких как SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION и SYSTEM_UI_FLAG_LAYOUT_STABLE), чтобы содержимое изменялось, когда системные бары скрываются и отображаются.

Вы также должны следить за тем, чтобы панель действий и другие элементы управления пользовательского интерфейса были спрятаны одновременно. Этот фрагмент демонстрирует, как скрывать и отображать статусные и навигационные панели без изменения размера содержимого:

 // 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); } 

Надеюсь это поможет.