马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. 修改 Activity 的 Manifest 配置
确保你的 Activity 在 AndroidManifest.xml 中有以下配置:
- <activity
- android:name=".YourActivity"
- android:windowSoftInputMode="adjustResize|stateHidden"
- />
复制代码 关键点:
- adjustResize 是关键属性,使结构会为键盘腾出空间
- stateHidden 可选,表现初始时不主动弹出键盘
2. 更新结构文件
利用 CoordinatorLayout 实现最可靠的效果:
- <androidx.coordinatorlayout.widget.CoordinatorLayout
- 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"
- android:fitsSystemWindows="true">
- <!-- 界面中的其余布局 -->
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/recyclerView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipToPadding="false"
- android:paddingBottom="72dp" /> <!-- 留出输入框高度的空间 -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:background="@android:color/white"
- android:orientation="horizontal"
- android:padding="8dp">
- <EditText
- android: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" />
- <ImageButton
- android: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.height
- val keypadHeight = screenHeight - rect.bottom
-
- if (keypadHeight > screenHeight * 0.15) { // 键盘显示
- binding.recyclerView.post {
- val lastPosition = (binding.recyclerView.adapter?.itemCount ?: 0) - 1
- if (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就是界面的最外层layout
- binding.content.updatePadding(top = -systemBars.top)
- insets
- }
- }
复制代码
[code][/code]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |