我不理解windowinsets rect,因为docs说:
系统窗口插入表示全屏窗口部分或完全被状态栏、导航栏、输入法或其他系统窗口遮挡的区域。
因此,可以有多个窗口插入,每个窗口都有自己的rect(一个用于状态栏,另一个用于导航栏…),我如何检索它们?
或者只有一个窗口插入,它的左上右下坐标是应用程序可用窗口的矩形?

最佳答案

WindowInsets描述了一组窗口内容的插入。
换句话说,WindowInsets有应用程序可用区域的一个rect(还有其他信息,如isRound)。可用面积不包括StatusBarNavigationBar的rect。
如果您只想知道StatusBarNavigationBar的高度,请检查this
你可以像下面这样得到。
以下示例使用WindowInsetsCompat进行兼容性。
在style.xml中:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    ...
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>

在androidmanifest.xml中
<application
        ...
        android:theme="@style/AppTheme">

        ...

</application>

在布局XML中:(应将fitsSystemWindows设置为获取窗口插入。)
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

    <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

</FrameLayout>

在你的活动中(或任何地方):
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View container = findViewById(R.id.container);

        ViewCompat.setOnApplyWindowInsetsListener(container, new OnApplyWindowInsetsListener() {
            @Override
            public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {

                //you can do something with insets.
                int statusBar = insets.getSystemWindowInsetTop(); //this is height of statusbar
                int navigationBar = insets.getStableInsetBottom(); //this is height of navigationbar
                Log.d("MainActivity", String.format("%s %s", statusBar, navigationBar));

                ViewCompat.onApplyWindowInsets(v, insets);
                return insets;
            }
        });
    }
}

窗口插入如下:
android - 有多少WindowInsets?-LMLPHP

08-05 20:45