有多少WindowInsets?

时间:2016-08-02 17:48:43

标签: android android-view android-windowmanager

我不了解WindowInsets rects,因为docs说:

  

系统窗口inset表示状态栏,导航栏,IME或其他系统窗口部分或完全遮挡的全屏窗口区域。

因此,多个WindowInsets可以在每个都有自己的rect(一个用于状态栏,另一个用于导航栏......),我该如何检索它们?

或者只有一个WindowInsets,它的左上角 - 右下角坐标是应用程序可用窗口的矩形吗?

2 个答案:

答案 0 :(得分:7)

WindowInsets描述了窗口内容的一组插入。 换句话说,WindowInsets有一个应用程序可用区域的矩形(还有其他信息,如isRound)。可用区域不包括StatusBarNavigationBar的矩形。

如果您只想知道StatusBarNavigationBar的高度,请检查this

您可以像WindowInsets一样得到以下内容。 以下示例使用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来获取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是这样的:

enter image description here

答案 1 :(得分:2)

只有一种类型的WindowInsets描述了窗口内容的一组插入。因为它是不可变的,并且可能会在将来扩展为包含更多的插入类型。你可以创建更多的实例。你还可以使用像getStableInsetBottom()等方法获得WindowInsets的左,右等内容,以像素为单位。