Sipdroid应用窗口顶部出现类状态栏大块留白无法隐藏如何解决
Android Sipdroid UI顶部留白问题
我正在编辑Sipdroid并对其UI进行修改,但是该应用的每一个Activity顶部都存在一块我暂时无法通过任何方式隐藏的大块留白区域。这块区域看起来被系统识别为状态栏,不仅从我下方分享的代码可以验证这一点,同时每当我修改状态栏颜色时,这块留白区域也会同步变为对应颜色。目前我找到的唯一能避免屏幕顶部出现该内边距的方法是在样式XML中添加<item name="android:windowTranslucentStatus">true</item>配置。
以下是布局XML文件和Kotlin类的代码:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/hello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="Hello World" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
package org.sipdroid.sipua.ui import android.app.Activity import android.graphics.Rect import android.os.Bundle import android.view.View import android.view.Window import android.widget.TextView import android.widget.Toast import org.sipdroid.sipua.R class TestActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_test) val btn = findViewById<TextView>(R.id.hello) btn.setOnClickListener { // gets the status bar height val rectangle = Rect() window.decorView.getWindowVisibleDisplayFrame(rectangle) val statusBarHeight = rectangle.top val contentViewTop = window.findViewById<View>(Window.ID_ANDROID_CONTENT).top val titleBarHeight = contentViewTop - statusBarHeight // makes the TextView as high as the status bar, // so we have a visual representation of the // actual height with layout bounds visible btn.height = statusBarHeight Toast.makeText( this@TestActivity, "$statusBarHeight $titleBarHeight ${rectangle.height()}", Toast.LENGTH_SHORT ).show() } } }
此处为开启和关闭布局边界显示的对应截图。
解决方案
这个问题的根因是系统默认给布局预留了状态栏位置,你可以根据需求任选以下方案解决:
方案1:全局主题配置
在你的应用主题XML中添加如下配置,不需要每个页面单独修改:
<!-- 隐藏默认标题栏 --> <item name="android:windowNoTitle">true</item> <!-- 禁止系统自动为布局留出状态栏位置 --> <item name="android:fitsSystemWindows">false</item> <!-- 将状态栏设为透明 --> <item name="android:statusBarColor">@android:color/transparent</item> <!-- 允许内容绘制到状态栏区域 --> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <!-- 刘海屏适配,允许内容绘制到刘海区域 --> <item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="p">shortEdges</item>
方案2:代码动态配置
如果只需要部分页面生效,可以在对应Activity的onCreate方法setContentView之前添加如下代码:
兼容低版本写法:
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN window.statusBarColor = Color.TRANSPARENT
Android 11及以上版本写法:
window.setDecorFitsSystemWindows(false) window.statusBarColor = Color.TRANSPARENT // 如果需要完全隐藏状态栏可以添加以下代码 window.insetsController?.apply { hide(WindowInsets.Type.statusBars()) systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE }
方案3:单布局配置
只需要给对应布局的根节点添加fitsSystemWindows属性即可:
<androidx.constraintlayout.widget.ConstraintLayout ... android:fitsSystemWindows="false"> ... </androidx.constraintlayout.widget.ConstraintLayout>
另外你可以排查Sipdroid的基类Activity是否有强制设置顶部padding适配状态栏的逻辑,如果有相关代码直接删除即可。
内容的提问来源于stack exchange,提问作者Vincenzo Longobardi
相关产品推荐
相关产品推荐

