当前位置: 首页 > 知识库问答 >
问题:

如何使状态栏完全透明?

王兴腾
2023-03-14

我想让我的状态栏透明,但也没有图标。我设法让它消失了,但它留下了一条没有填充背景的线。我想改变这一点,这样我就可以在没有任何图标的情况下看到背景。

另外,我正在小米Redmi Note 8T上测试它

代码(结果见第一张图片)

主要活动。kt

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate

class MainActivity : AppCompatActivity() {

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) hideSystemUI()
    }

    private fun hideSystemUI() {SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    window.decorView.systemUiVisibility = 
                (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_FULLSCREEN)
    }

    override fun onCreate(savedInstanceState: Bundle?) {

        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

都themes.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <style name="Theme.TestingSystemModes" parent="Theme.Design.NoActionBar">
        <item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
    </style>
</resources>

下面是这一行的样子:

我希望它看起来像下图,但没有状态栏的图标:

编辑:我想,是手机让它变成了这样(中间有一个摄像头),可能黑线是为了融入摄像头。这就是为什么,无论我做了什么,它都没有消失。尽管如此,还是要感谢所有试图帮助我的人。

共有3个答案

杨波娃
2023-03-14

您可以使用下面的线条使其透明,也可以设置修复颜色getWindow()。setSoftInputMode(WindowManager. LayoutParams.SOFT_INPUT_STATE_HIDDEN|WindowManager. LayoutParams.SOFT_INPUT_ADJUST_RESIZE);getWindow()。setStatusBarColor(ContextCompat.getColor(ContaltUsActivity.this,R.color.white ));// 设置状态背景白色

章丰茂
2023-03-14

在主题中设置这些属性。就这些

<item name="android:windowTranslucentStatus">true</item>
史承福
2023-03-14

问题:

手机现在可以有一个“切口”(用于有缺口的手机等。),当你正确隐藏状态栏时,手机会想“好吧,我需要让以前的状态栏只是一个黑色的切口,这样它看起来就不会很傻。”

解决方案是:

实际上你需要做四件事:

  1. 告诉Android你不想在应用程序中使用状态栏(隐藏它们)。现在有了一种正确的向后兼容的方法,我将在下面详细介绍
  2. 让Android把应用程序画在切割区域的后面
  3. 告诉Android,你的布局不应该适合系统窗口(如果你不这样做,它仍然会将你的布局放在状态栏原来的位置)
  4. 手动调整底部的插图,当你告诉Android你的布局不适合系统窗口时(第3步),不幸的是,这将包括导航栏,所以如果你不为此进行调整,那么你的布局将位于导航栏下,这可能是不可取的

代码:

下面是一个简洁的小扩展函数,将涵盖步骤1和3。。。(隐藏状态栏,将decorfitsystemwindows设置为false)。这样,在你的活动中,就可以简单地把窗口放进去。setInImmersiveMode()

fun Window.setInImmersiveMode() {
    val windowInsetsController = ViewCompat.getWindowInsetsController(decorView) ?: return
    windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    windowInsetsController.hide(WindowInsetsCompat.Type.statusBars())
    WindowCompat.setDecorFitsSystemWindows(this, false)
}

你需要改变你的主题。xml来告诉Android在这些剪贴画后面画线(仅限api 27及以上版本,因此工具为:targetApi部分):

<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="o_mr1">shortEdges</item>

最后,还有一个稍微复杂一点的代码来处理为您的布局设置底部插页——我又把它变成了一个扩展函数,这样您就可以调用view.setup插页()

fun View.setupInsets() {
    ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
        val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
        view.layoutParams = (view.layoutParams as FrameLayout.LayoutParams).apply {
            bottomMargin = insets.bottom
        }
        WindowInsetsCompat.CONSUMED
    }
}
 类似资料:
  • 我的styles.xml: 我能做的是:

  • 我注意到当打开我的应用程序时,有两个屏幕可以到达我的第一个颤动屏幕 1-1屏幕有灰色或(50%透明)状态和导航栏黑色和浅色图标。2-2屏幕有100%透明的状态和导航栏和白色图标。 我怎么能让所有的屏幕像第一次颤动屏幕100透明状态和导航栏与黑色图标(亮度暗)。 第一屏 第二屏 第一个颤振筛 风格xml 主要活动。kt 编辑 现在我已经改变了我的代码,第一个屏幕是正确的,但第二个屏幕仍然图标是白色的

  • 嗨,朋友们,我想知道我可以更改状态栏颜色还是使其完全透明。 我已经尝试了这么多,但我不能得到完全透明的状态栏,所以这里是我的代码.. v21/style.xml 和style.xml 我想要这样的.. 有人能帮忙吗?谢谢

  • 我想制作一个完全透明的状态栏和导航栏,就像Google Play那样。当我使用窗口设置来实现它时,键盘会覆盖编辑文本。 当此代码使用键盘输入覆盖的编辑文本时: 此外,该代码并没有使其完全透明,它只是使其半透明 还是这个

  • 有人知道如何使用React Native使Android状态栏透明吗? 不透明,透明。 我也在使用react导航。

  • 我在试着做一个Android发射器。我想实现一个完全透明的状态栏和导航栏,这里是我的主题xml文件。 最后两项不管用,Lollipop上还有影子。 我想实现的(新星发射器): 如何让状态栏和导航栏“透明”而不是“半透明”?