简体   繁体   中英

Hide Status bar in a fragment or make the fragment full screen

I have a kotlin app with bottom navigation setup.

I currently have 5 fragments [ProfileFragment, SearchFragment, HomeFragment, SettingsFragment, WebViewFragment]

All of these are just blank fragments. But in my Profile Fragment, I'm showing off a panaroma widget in the top half of the page

个人资料页

I know about making my whole app full screen, but then, on other fragments, content will get hidden under notched displays. And by content, I mean my employer's logo, which he wants, without fail.

So, I tried another way. I made the app full screen and added padding wherever, there was content hiding under the notch. Now, there happen to be various phones, without notches. The content looked unusually padded down, because, well, there was no notch.

If I make adjustments for notched display, the non-notch displays will give issues. And vice-versa.

So, I figured, why not instead of making all activities in my app fullscreen, If I can stretch the ProfileFragment to cover the status bar, or hide the status bar, it'd be a perfect solution.

Is there a way to do either of the following?

  • Hide the status bar on the ProfileFragment
  • Stretch the fragment to the top of the screen
  • Make the fragment full screen, without cutting off the bottom navigation

You can try adding this code in your Activity:

// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the status bar is hidden, so hide that too if necessary.
actionBar?.hide()

More info here: https://developer.android.com/training/system-ui/status#kotlin

AndroidX (support library) has a built-in OnApplyWindowInsetsListener which helps you determine the window insets such as top (status bar) or bottom insets (ie. keyboard) in a device-compatible way.

Since the insets work for API 21+ you have to get the insets manually for below that. Here is an example in Java (v8), hope you get the hang of it:

public class MainActivity extends AppCompatActivity {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        View mainContainer = findViewById(R.id.main_container);   // You layout hierarchy root

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            ViewCompat.setOnApplyWindowInsetsListener(mainContainer , (v, insets) -> {
                int statusBarHeight = 0;
                if (!isInFullscreenMode(getWindow())) statusBarHeight = insets.getSystemWindowInsetTop();

                // Get keyboard height
                int bottomInset = insets.getSystemWindowInsetBottom();

                // Add status bar and bottom padding to root view
                v.setPadding(0, statusBarHeight, 0, bottomInset);
                return insets;
            });
        } else {
            int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
            int statusBarHeight = 0;
            if (resourceId > 0 && !isInFullscreenMode(getWindow())) {
                statusBarHeight = getResources().getDimensionPixelSize(resourceId);
            }

            View decorView = getWindow().getDecorView();
            decorView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
                Rect r = new Rect();
                //r will be populated with the coordinates of your view that area still visible.
                decorView.getWindowVisibleDisplayFrame(r);

                //get screen height and calculate the difference with the useable area from the r
                int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
                int bottomInset = height - r.bottom;

                // if it could be a keyboard add the padding to the view
                // if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
                //set the padding of the contentView for the keyboard
                mainContainer.setPadding(0, statusBarHeight, 0, bottomInset);
            });
        }
        ...
    }

    public static boolean isInFullscreenMode(Window activityWindow) {
        return (activityWindow.getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }
}

Note that for the bottom inset to work you have to tell Android that your activity is resizable, so in your AndroidManifest.xml :

<application
    ...>
    <activity
        android:name=".MainActivity"
        ...
        android:windowSoftInputMode="adjustResize"/>
    ...
</application>

If you use AppCompatActivity, you can also use:

if(getSupportActionBar() != null) {
   getSupportActionBar().hide();
}

in the onCreate methode.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM