您的位置:

深入探究Android fitssystemwindows

在Android开发中,我们有时候需要让布局充满整个屏幕,或者需要控制布局和系统UI的交互关系。此时,Android提供了一个非常有用的属性,就是fitssystemwindows。它可以控制布局与系统UI之间的交互,保证应用程序UI不会被系统UI挡住或者覆盖,同时也能让UI更加美观。

一、什么是fitssystemwindows

fitssystemwindows是Android提供的一个属性,设置该属性为true时,可以使ViewGroup扩展到屏幕的边缘 ,并且会留出系统UI的空间。系统UI包括状态栏、导航栏、输入法等,系统UI是指Android系统上方的一部分屏幕区域。

例如设置Activity的布局文件中设置:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:fitsSystemWindows="true">
...
</LinearLayout>

设置fitssystemwindows=true属性后,LinearLayout就会顶部与状态栏平齐,并且底部会留出导航栏的位置.

二、fitssystemwindows适用场景

1.全屏应用

对于需要全屏显示的应用程序,为了避免系统UI覆盖应用UI,可以设置root view的fitsSystemWindows属性为true,从而让布局能够正常显示并且能够避免UI部分被覆盖。

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

    ...

</androidx.constraintlayout.widget.ConstraintLayout>

2.使用Toolbar

当我们在界面中使用Toolbar时,为了避免状态栏和Toolbar重叠,我们可以使用fitsSystemWindows属性来为Toolbar留出状态栏的位置。

<androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:fitsSystemWindows="true">

3.滑动控件

当我们使用一些滑动控件(例如RecyclerView、ScrollView等)时,如果不设置fitsSystemWindows属性,控件的起始位置会被遮挡住一部分,会让用户体验感受较差。

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        ...
</ScrollView>

三、适配各种平台版本

由于系统UI在不同的Android版本中有所不同,所以适配各种版本的系统UI也是非常重要的一点。我们可以通过代码检测状态栏和导航栏的高度,然后通过设置fitsSystemWindows属性实现合适的适配。

例如,在Activity的onCreate()方法中,我们可以使用以下代码判断系统UI的高度,然后设置fitsSystemWindows属性。

// 设置fitsSystemWindows属性为true
ViewGroup rootView = findViewById(android.R.id.content);
ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener() {
    @Override
    public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
        // 获取状态栏高度和导航栏高度
        int statusBarHeight = insets.getSystemWindowInsetTop();
        int navigationBarHeight = insets.getSystemWindowInsetBottom();

        // 设置fitsSystemWindows属性为true
        v.setPadding(0, statusBarHeight, 0, navigationBarHeight);

        return insets;
    }
});

四、结论

通过本文的介绍,我们了解了Android fitssystemwindows属性的作用和使用方法,同时也介绍了fitssystemwindows的适用场景和在各种平台版本中的适配方法。