Android中实现沉浸式布局并支持软键盘弹出不遮挡布局

效果图

步骤:

1.style.xml文件
XML 复制代码
<style name="NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- 让内容布局延伸到状态栏下方 -->
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:windowTranslucentStatus">false</item>
    </style>
2.AndroidMainfest.xml文件
XML 复制代码
 <activity
            android:name=".ChatActivity"
            android:exported="true"
            android:screenOrientation="portrait"
            android:theme="@style/NoActionBar"
            android:windowSoftInputMode="stateVisible|adjustResize" />
3.工具类
java 复制代码
package com.hat

import android.app.Activity
import android.graphics.Color
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.OnApplyWindowInsetsListener
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import com.zbxh.chat.utils.DefaultDarkScrim
import com.zbxh.chat.utils.DefaultLightScrim
import com.zbxh.chat.utils.SystemBarStyle
import com.zbxh.chat.utils.enableEdgeToEdge

class SetSystemBars {
    companion object{
        fun setupSystemBars(activity: Activity,view: View) {
            // 沉浸式状态栏配置
            WindowCompat.setDecorFitsSystemWindows(activity.window, false)
            activity.window.statusBarColor = Color.TRANSPARENT
            val insetsListener = OnApplyWindowInsetsListener { view, insets ->
                val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
                val item = insets.getInsets(WindowInsetsCompat.Type.ime())
                view.updatePadding(
                    top = 0,    // 顶部留出状态栏空间
                    bottom = item.bottom,//软键盘不遮挡布局,需要预留出软键盘空间
                    left = systemBars.left,
                    right = systemBars.right
                )
                insets
            }
            ViewCompat.setOnApplyWindowInsetsListener(view, insetsListener)
        }
        fun setupSystemBars2(activity: Activity) {
            (activity as AppCompatActivity).enableEdgeToEdge(
                SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
                SystemBarStyle.auto(DefaultLightScrim, DefaultDarkScrim))
        }
    }
}
4.使用
java 复制代码
package com.chat;

public class ChatActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //一定要在setContentView前调用
        SetSystemBars.Companion.setupSystemBars(this,findViewById(R.id.chat));//R.id.chat是界面中根布局的ID
        setContentView(R.layout.activity_chat_main);
    }
}