1. 修改 Activity 的 Manifest 配置
确保你的 Activity 在 AndroidManifest.xml
中有以下配置:
<activityandroid:name=".YourActivity"android:windowSoftInputMode="adjustResize|stateHidden"
/>
关键点:
-
adjustResize
是关键属性,使布局会为键盘腾出空间 -
stateHidden
可选,表示初始时不自动弹出键盘
2. 更新布局文件
使用 CoordinatorLayout 实现最可靠的效果:
<androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns: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"android:fitsSystemWindows="true"><!-- 界面中的其余布局 --><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"android:clipToPadding="false"android:paddingBottom="72dp" /> <!-- 留出输入框高度的空间 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:background="@android:color/white"android:orientation="horizontal"android:padding="8dp"><EditTextandroid:id="@+id/etMessage"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="输入消息..."android:imeOptions="actionSend"android:inputType="textCapSentences|textMultiLine" /><ImageButtonandroid:id="@+id/btnSend"android:layout_width="48dp"android:layout_height="48dp"android:src="@drawable/ic_send"android:background="?attr/selectableItemBackgroundBorderless" /></LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
3. 确保主题配置正确
在 styles.xml
中,确保 Activity 主题不是全屏模式:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"><!-- 不要设置以下属性,否则会失效 --><!-- <item name="android:windowFullscreen">true</item> -->
</style>
4. 添加自动滚动功能(可选但推荐)
在代码中添加:
private fun setupKeyboardBehavior() {binding.root.viewTreeObserver.addOnGlobalLayoutListener {val rect = Rect()binding.root.getWindowVisibleDisplayFrame(rect)val screenHeight = binding.root.heightval keypadHeight = screenHeight - rect.bottomif (keypadHeight > screenHeight * 0.15) { // 键盘显示binding.recyclerView.post {val lastPosition = (binding.recyclerView.adapter?.itemCount ?: 0) - 1if (lastPosition >= 0) {binding.recyclerView.smoothScrollToPosition(lastPosition)}}}}
}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)setupKeyboardBehavior()// ...其他初始化代码...
}
注意:enableEdgeToEdge失效问题
当布局使用enableEdgeToEdge(界面延申到通知栏的)时enableEdgeToEdge会失效
解决办法:
public override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(binding.root)//解决enableEdgeToEdge与fitsSystemWindows= false时的冲突ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { view, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())//binding.content就是界面的最外层layoutbinding.content.updatePadding(top = -systemBars.top)insets}
}