2015-12-22 2 views
13

Я пытаюсь реализовать полноэкранный режим, но для Android 4.4 и выше, это показывает пустое место там:Immersive режим показывает пустое пространство

ПЕРЕД захватывающем режиме (полноэкранный)

enter image description here

и ПОСЛЕtoggleFullScreen (false);

enter image description here

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

public void toggleFullscreen(boolean fs) { 
     if (Build.VERSION.SDK_INT >= 11) { 
      // The UI options currently enabled are represented by a bitfield. 
      // getSystemUiVisibility() gives us that bitfield. 
      int uiOptions = this.getWindow().getDecorView().getSystemUiVisibility(); 
      int newUiOptions = uiOptions; 
      boolean isImmersiveModeEnabled = 
        ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions); 
      if (isImmersiveModeEnabled) { 
       Log.i(getPackageName(), "Turning immersive mode mode off. "); 
      } else { 
       Log.i(getPackageName(), "Turning immersive mode mode on."); 
      } 

      // Navigation bar hiding: Backwards compatible to ICS. 
      if (Build.VERSION.SDK_INT >= 14) { 
       newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
      } 

      // Status bar hiding: Backwards compatible to Jellybean 
      if (Build.VERSION.SDK_INT >= 16) { 
       newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN; 
      } 

      // Immersive mode: Backward compatible to KitKat. 
      // Note that this flag doesn't do anything by itself, it only augments the behavior 
      // of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample 
      // all three flags are being toggled together. 
      // Note that there are two immersive mode UI flags, one of which is referred to as "sticky". 
      // Sticky immersive mode differs in that it makes the navigation and status bars 
      // semi-transparent, and the UI flag does not get cleared when the user interacts with 
      // the screen. 
      if (Build.VERSION.SDK_INT >= 18) { 
       newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
      } 
      getWindow().getDecorView().setSystemUiVisibility(newUiOptions); 
     } else { 
      // for android pre 11 
      WindowManager.LayoutParams attrs = getWindow().getAttributes(); 
      if (fs) { 
       attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; 
      } else { 
       attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN; 
      } 
      this.getWindow().setAttributes(attrs); 
     } 

     try { 
      // hide actionbar 
      if 
        (this instanceof AppCompatActivity) { 
       if (fs) getSupportActionBar().hide(); 
       else getSupportActionBar().show(); 
      } else if 
        (Build.VERSION.SDK_INT >= 11) { 
       if (fs) getActionBar().hide(); 
       else getActionBar().show(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+0

Вы нашли решение для этого. Я столкнулся с той же проблемой – glo

+0

@glo решение, приведенное ниже, работает для меня. проверьте [this] (https://gitlab.com/ankit_aggarwal/ToggleFullScreenDemo.git) код –

+0

@glo это происходит в android L и выше только или для более низких версий также? Если да, то это происходит только с статусом или с нижней навигационной панелью? –

ответ

24

Пожалуйста, убедитесь, что у вас нет android:fitsSystemWindows="true" в макете.

По крайней мере, он решил мое дело - у меня была fitsSystemWindows на FrameLayout.

0

Вам нужно добавить этот флаг на ваш взгляд View.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); 
} 
+0

hi @android_Muncher, он не решил: = (, im, используя Fragment, но вызывающий togglefullscreen из Activity, все еще показывает серое пространство, где были мягкие кнопки, и черное пространство, где панель уведомлений была – user2582318

+0

mDecorView из примера, который я поделил, должен ваше представление, которое должно быть полноэкранным. Не имеет значения, является ли это фрагментом или действием. Вы можете получить текущее представление, используя это залоговое значение кода. final View decorView = getWindow(). getDecorView(); –

3

Я новичок здесь, поэтому не могу комментировать, но хотел добавить что-то, что меня так расстроило меня по поводу вышеупомянутого решения. Я продолжал проверять свою деятельность и ее фрагменты на android:fitsSystemWindows="true", и это определенно не было, но у меня оставался разрыв внизу! Я сходил с ума! Нелегко было бы решить эту простую вещь!

Оказывается, он также появился в ящике навигации, который я добавил ... так что обязательно проверьте все свои XML!

Смежные вопросы