关于Android弹出软键盘“顶起”View的问题
16lz
2022-03-23
关于Android弹出软键盘“顶起”View的问题
问题简单一带而过,后面直接说解决思路,Android系统已经给我们提供了防止键盘遮挡输入内容的解决方案,比如在清单文件对应的Activity添加:
android:windowSoftInputMode="adjustPan|stateHidden"
这种方式很简单,在一些需要编辑的页面,可以将EditText顶起,解决了键盘可能遮挡的问题。
但是它还存在一个问题,就是他只能“顶起”输入部分,比如一个聊天页面,输入框在下方,我们希望的是,当键盘弹出的时候,将底部整个输入部分的View全部顶起,而不单单是不遮挡输入内容这么简单。
下面来简单说一下解决方案,“顶起”之所以加引号,是因为键盘并不是真正的将控件顶起来了,键盘是在视图的最上层,我们可以自定义一个需要适配键盘弹出和隐藏的View,来改变View的高度,达到所谓的弹出软键盘“顶起”View的效果。如图:
以下示例为Kotlin
,只做了最简单的适配示例,如果需要实现个性化需求,可自行修改。
自定义一个控件InputPanelView
,监听键盘弹出高度。
package ……import android.content.Contextimport android.graphics.Rectimport android.util.AttributeSetimport android.view.LayoutInflaterimport android.view.Viewimport android.widget.RelativeLayoutimport kotlinx.android.synthetic.main.view_input_panel.view.*class InputPanelView(context: Context?, attrs: AttributeSet?) : RelativeLayout(context, attrs) { companion object { private const val TAG = "InputPanelView" } init { LayoutInflater.from(context).inflate(R.layout.view_input_panel, this, true) viewTreeObserver.addOnGlobalLayoutListener { val rect = Rect() getWindowVisibleDisplayFrame(rect) val screenHeight = rootView.height val keyboardHeight = screenHeight - rect.bottom Log.d(TAG, "键盘高度:$keyboardHeight measuredHeight = $measuredHeight") resetHeight(keyboardHeight) } } private fun resetHeight(keyboardHeight: Int) { when { 0 == keyboardHeight && rl_extra_view?.visibility == View.VISIBLE -> { rl_extra_view?.visibility = View.GONE } 0 < keyboardHeight && rl_extra_view?.visibility == View.GONE -> { val layoutParams = rl_extra_view?.layoutParams layoutParams?.height = keyboardHeight rl_extra_view?.layoutParams = layoutParams rl_extra_view?.visibility = View.VISIBLE } } }}
自定义View view_input_panel.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="@dimen/y114" android:background="@android:color/white" android:minHeight="@dimen/y114" android:orientation="horizontal"> <EditText android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/transparent" android:hint="请输入消息..." android:inputType="text" android:paddingStart="@dimen/x30" android:paddingEnd="@dimen/x30" android:textColor="#222222" android:textColorHint="#BDBDBD" android:textSize="@dimen/s30" /> <ImageButton android:id="@+id/ib_red_packets" android:layout_width="@dimen/x114" android:layout_height="match_parent" android:background="@android:color/transparent" android:contentDescription="@string/app_name" android:src="@mipmap/icon_chat_room_red_packets" /> <ImageButton android:id="@+id/ib_send" android:layout_width="@dimen/x114" android:layout_height="match_parent" android:background="@android:color/transparent" android:contentDescription="@string/app_name" android:src="@mipmap/icon_chat_room_send" /> LinearLayout> <RelativeLayout android:id="@+id/rl_extra_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/ll" android:visibility="gone"> RelativeLayout>RelativeLayout>
更多相关文章
- Android(安卓)如何让EditText不自动获取焦点
- Android(安卓)EditText inputType属性
- 浅谈Android五大布局(一)――LinearLayout、FrameLayout和Absoulte
- android软键盘的显示后隐藏
- Android(安卓)软键盘小知识点
- Android监听键盘显示和隐藏
- android webview在弹出软键盘时,布局没有上移的解决办法
- Android监听键盘上的确定键等
- Android(安卓)跳转界面 自动弹出输入框