Пример #1
0
 public static void setLightStatusBar(@NonNull View view) {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
     int flags = view.getSystemUiVisibility();
     flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
     view.setSystemUiVisibility(flags);
   }
 }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
    final View flagsView = inflater.inflate(R.layout.fragment_flags, container, false);
    mLowProfileCheckBox = (CheckBox) flagsView.findViewById(R.id.flag_enable_lowprof);
    mHideNavCheckbox = (CheckBox) flagsView.findViewById(R.id.flag_hide_navbar);
    mHideStatusBarCheckBox = (CheckBox) flagsView.findViewById(R.id.flag_hide_statbar);
    mImmersiveModeCheckBox = (CheckBox) flagsView.findViewById(R.id.flag_enable_immersive);
    mImmersiveModeStickyCheckBox =
        (CheckBox) flagsView.findViewById(R.id.flag_enable_immersive_sticky);

    Button toggleFlagsButton = (Button) flagsView.findViewById(R.id.btn_changeFlags);
    toggleFlagsButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            toggleUiFlags();
          }
        });

    Button presetsImmersiveModeButton = (Button) flagsView.findViewById(R.id.btn_immersive);
    presetsImmersiveModeButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View view) {

            // For immersive mode, the FULLSCREEN, HIDE_HAVIGATION and IMMERSIVE
            // flags should be set (you can use IMMERSIVE_STICKY instead of IMMERSIVE
            // as appropriate for your app).  The LOW_PROFILE flag should be cleared.

            // Immersive mode is primarily for situations where the user will be
            // interacting with the screen, like games or reading books.
            int uiOptions = flagsView.getSystemUiVisibility();
            uiOptions &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
            uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
            uiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE;
            uiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            flagsView.setSystemUiVisibility(uiOptions);

            dumpFlagStateToLog(uiOptions);

            // The below code just updates the checkboxes to reflect which flags have been set.
            mLowProfileCheckBox.setChecked(false);
            mHideNavCheckbox.setChecked(true);
            mHideStatusBarCheckBox.setChecked(true);
            mImmersiveModeCheckBox.setChecked(true);
            mImmersiveModeStickyCheckBox.setChecked(false);
          }
        });

    Button presetsLeanbackModeButton = (Button) flagsView.findViewById(R.id.btn_leanback);
    presetsLeanbackModeButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View view) {

            // For leanback mode, only the HIDE_NAVE and HIDE_STATUSBAR flags
            // should be checked.  In this case IMMERSIVE should *not* be set,
            // since this mode is left as soon as the user touches the screen.
            int uiOptions = flagsView.getSystemUiVisibility();
            uiOptions &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
            uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
            uiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
            uiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE;
            uiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
            flagsView.setSystemUiVisibility(uiOptions);

            dumpFlagStateToLog(uiOptions);

            // The below code just updates the checkboxes to reflect which flags have been set.
            mLowProfileCheckBox.setChecked(false);
            mHideNavCheckbox.setChecked(true);
            mHideStatusBarCheckBox.setChecked(true);
            mImmersiveModeCheckBox.setChecked(false);
            mImmersiveModeStickyCheckBox.setChecked(false);
          }
        });

    // Setting these flags makes the content appear under the navigation
    // bars, so that showing/hiding the nav bars doesn't resize the content
    // window, which can be jarring.
    int uiOptions = flagsView.getSystemUiVisibility();
    uiOptions |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
    uiOptions |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
    uiOptions |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
    flagsView.setSystemUiVisibility(uiOptions);

    return flagsView;
  }
  /** Detects and toggles immersive mode (also known as "hidey bar" mode). */
  public void toggleUiFlags() {

    // BEGIN_INCLUDE (get_current_ui_flags)
    // The "Decor View" is the parent view of the Activity.  It's also conveniently the easiest
    // one to find from within a fragment, since there's a handy helper method to pull it, and
    // we don't have to bother with picking a view somewhere deeper in the hierarchy and calling
    // "findViewById" on it.
    View decorView = getActivity().getWindow().getDecorView();
    int uiOptions = decorView.getSystemUiVisibility();
    int newUiOptions = uiOptions;
    // END_INCLUDE (get_current_ui_flags)

    // BEGIN_INCLUDE (toggle_lowprofile_mode)
    // Low profile mode doesn't resize the screen at all, but it covers the nav & status bar
    // icons with black so they're less distracting.  Unlike "full screen" and "hide nav bar,"
    // this mode doesn't interact with immersive mode at all, but it's instructive when running
    // this sample to observe the differences in behavior.
    if (mLowProfileCheckBox.isChecked()) {
      newUiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
    } else {
      newUiOptions &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
    }
    // END_INCLUDE (toggle_lowprofile_mode)

    // BEGIN_INCLUDE (toggle_fullscreen_mode)
    // When enabled, this flag hides non-critical UI, such as the status bar,
    // which usually shows notification icons, battery life, etc
    // on phone-sized devices.  The bar reappears when the user swipes it down.  When immersive
    // mode is also enabled, the app-drawable area expands, and when the status bar is swiped
    // down, it appears semi-transparently and slides in over the app, instead of pushing it
    // down.
    if (mHideStatusBarCheckBox.isChecked()) {
      newUiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
    } else {
      newUiOptions &= ~View.SYSTEM_UI_FLAG_FULLSCREEN;
    }
    // END_INCLUDE (toggle_fullscreen_mode)

    // BEGIN_INCLUDE (toggle_hidenav_mode)
    // When enabled, this flag hides the black nav bar along the bottom,
    // where the home/back buttons are.  The nav bar normally instantly reappears
    // when the user touches the screen.  When immersive mode is also enabled, the nav bar
    // stays hidden until the user swipes it back.
    if (mHideNavCheckbox.isChecked()) {
      newUiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    } else {
      newUiOptions &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    }
    // END_INCLUDE (toggle_hidenav_mode)

    // BEGIN_INCLUDE (toggle_immersive_mode)
    // Immersive mode doesn't do anything without at least one of the previous flags
    // enabled.  When enabled, it allows the user to swipe the status and/or nav bars
    // off-screen.  When the user swipes the bars back onto the screen, the flags are cleared
    // and immersive mode is automatically disabled.
    if (mImmersiveModeCheckBox.isChecked()) {
      newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE;
    } else {
      newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE;
    }
    // END_INCLUDE (toggle_immersive_mode)

    // BEGIN_INCLUDE (toggle_immersive_mode_sticky)
    // There's actually two forms of immersive mode, normal and "sticky".  Sticky immersive mode
    // is different in 2 key ways:
    //
    // * Uses semi-transparent bars for the nav and status bars
    // * This UI flag will *not* be cleared when the user interacts with the UI.
    //   When the user swipes, the bars will temporarily appear for a few seconds and then
    //   disappear again.
    if (mImmersiveModeStickyCheckBox.isChecked()) {
      newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    } else {
      newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    }
    // END_INCLUDE (toggle_immersive_mode_sticky)

    // BEGIN_INCLUDE (set_ui_flags)
    // Set the new UI flags.
    decorView.setSystemUiVisibility(newUiOptions);
    // END_INCLUDE (set_ui_flags)

    dumpFlagStateToLog(uiOptions);
  }