joy keeps flowin'

解决系统界面高度变化——WindowInsets

xx
目次

Android开发中,输入框作为最最基础的View之一,使用的频率是非常非常高的。

有输入框的地方就有软键盘,我知道有softinputmode可以设置软键盘弹起的行为,这只能响应软键盘弹起后整个Activity的应对行为。如果我想要拿到软键盘高度呢,这是softinputmode做不到的。你可能已经想到了监听View的变化,得到一个高度值,超过了某个阈值就认为软键盘已经弹起了。没错,这是之前常用的方式,要是我想软键盘高度会改变,怎么办?

WindowInsets #

WindowInsets是什么?window是窗口,对Android开发来说很熟悉,inset在Cambridge dictionary上解释为内衬,两个放在一起就是窗口的内衬。窗口的内衬也就是有东西占用了一部分窗口的内容,放上图片更容易理解。

示意图

WindowInsets的Window其实和Window不太一样,Android的内容显示是依赖Window的,应用中状态栏、导航栏虽然视觉效果是在应用中,其实都是在SystemUI中显示的,是在另一个Window中。所以WindowInsets中的可以理解成手机屏幕这样一个视觉窗口。

WindowInsets被设计出来就是要解决上面的这种场景的。你需要为接受软键盘高度变化的View设置一个listener,当软键盘变化时,就能从listener中拿到软键盘新的高度并做出对应处理。

1
2
3
4
5
findViewById<View>(R.id.main).setOnApplyWindowInsetsListener { v, insets ->
    val ime = insets.getInsets(WindowInsetsCompat.Type.ime())
    v.setPadding(ime.left, ime.top, ime.right, ime.bottom)
        insets
    }

细心的你也许发现了WindowInsetsCompat.Type.ime(),Type中也是有其他的类型的。像是systemBars、systemGestures等等,详细的列表你可以在在应用中全屏显示内容,并在 Compose 中处理窗口边衬区中找到。

参考 #

在应用中全屏显示内容,并在 Compose 中处理窗口边衬区

WindowInsets

标签:
Categories: