Сколько WindowInsets есть?

Я не понимаю, что такое WindowInsets rects, потому что docs говорит, что:

Вставка системного окна представляет собой область полноэкранного окна, которое частично или полностью скрывается в строке состояния, панели навигации, IME или других системных окнах.

Таким образом, несколько WindowInsets могут быть там каждый со своим собственным rect (один для строки состояния, другой для панели навигации...) и как их получить?

Или существует ли только один WindowInsets, а его координаты слева-сверху-справа-справа являются прямым доступным окном для приложения?

Ответы

Ответ 1

WindowInsets описывает набор вложений для содержимого окна. Другими словами, WindowInsets имеет один прямоугольник доступной области для приложения (и имеет другую информацию, например isRound). Доступная область исключает прямоугольник StatusBar и NavigationBar.

Если вы просто хотите узнать высоту StatusBar и NavigationBar, отметьте this.

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

В вашем стиле .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 должен быть установлен для получения WindowInsets.)

<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;
            }
        });
    }
}

WindowInsets выглядит так:

введите описание изображения здесь

Ответ 2

Существует только один тип WindowInsets, который описывает набор вложений для содержимого окна. поскольку он является неизменным и может быть расширен, чтобы в дальнейшем включать больше типов вставок. вы можете создать больше экземпляров. и вы также можете получить левые и правые вставки WindowInsets в пикселях с помощью таких методов, как getStableInsetBottom() и т.д.