首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >android.view.View.systemUiVisibility已弃用。替代方案是什么?

android.view.View.systemUiVisibility已弃用。替代方案是什么?
EN

Stack Overflow用户
提问于 2020-06-25 22:24:41
回答 16查看 42.8K关注 0票数 79

我已经将项目目标应用编程接口版本更新为30,现在我看到systemUiVisibility属性已被弃用。

下面的kotlin代码就是我正在使用的代码,它实际上相当于Java语言中的setSystemUiVisibility方法。

代码语言:javascript
运行
复制
playerView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LOW_PROFILE
            or View.SYSTEM_UI_FLAG_FULLSCREEN
            or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)

请让我知道,如果你有任何稳定的替代这个过时的代码。谷歌的建议是使用WindowInsetsController,但我不知道该怎么做。

EN

回答 16

Stack Overflow用户

发布于 2020-11-14 05:08:57

为了兼容性,请使用WindowCompatWindowInsetsControllerCompat。您需要将androidx.core的gradle依赖项至少升级到1.6.0-alpha03,以便在SDK < 30上支持setSystemBarsBehavior

代码语言:javascript
运行
复制
private fun hideSystemUI() {
    WindowCompat.setDecorFitsSystemWindows(window, false)
    WindowInsetsControllerCompat(window, mainContainer).let { controller ->
        controller.hide(WindowInsetsCompat.Type.systemBars())
        controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }
}

private fun showSystemUI() {
    WindowCompat.setDecorFitsSystemWindows(window, true)
    WindowInsetsControllerCompat(window, mainContainer).show(WindowInsetsCompat.Type.systemBars())
}

您可以通过观看此YouTube video了解有关WindowInsets的更多信息

对于在显示屏顶部有凹槽的设备,您可以将以下内容添加到v27 theme.xml文件中,使UI显示在凹槽的任一侧:

代码语言:javascript
运行
复制
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>

你可以在这个链接上阅读更多内容:Display Cutout

票数 59
EN

Stack Overflow用户

发布于 2020-10-06 15:43:37

TL;DR代码段

封装if-else结构,以避免旧版本的SDK出现java.lang.NoSuchMethodError: No virtual method setDecorFitsSystemWindows异常。

代码语言:javascript
运行
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    window.setDecorFitsSystemWindows(false)
} else {
    window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
}

有关Android 11中的嵌入和全屏模式的完整信息的链接

https://blog.stylingandroid.com/android11-windowinsets-part1/

https://www.youtube.com/watch?v=acC7SR1EXsI

票数 27
EN

Stack Overflow用户

发布于 2020-06-25 23:01:18

我希望它能对你有所帮助。

以前,当实现边缘到边缘导航或沉浸式模式时,要采取的第一步是使用systemUiVisibility标志来请求应用程序全屏布局,这个新的安卓版本不推荐使用这个字段,为了全屏布局应用程序,你必须在Window类上使用一个新方法:setDecorFitsSystemWindowsfalse作为参数传递如下。

代码语言:javascript
运行
复制
window.setDecorFitsSystemWindows(false)

WindowInsetsController类,允许您执行以前通过systemUiVisibility标志控制的操作,如隐藏或显示状态栏或导航栏(分别隐藏和显示方法)

例如,您可以轻松地显示和隐藏键盘,如下所示:

代码语言:javascript
运行
复制
// You have to wait for the view to be attached to the
// window (otherwise, windowInsetController will be null)
view.doOnLayout {
    view.windowInsetsController?.show(WindowInsets.Type.ime())
    // You can also access it from Window
    window.insetsController?.show(WindowInsets.Type.ime())
}
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62577645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档