关于Android弹出软键盘“顶起”View的问题
Posted Android-kongqw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Android弹出软键盘“顶起”View的问题相关的知识,希望对你有一定的参考价值。
关于android弹出软键盘“顶起”View的问题
问题简单一带而过,后面直接说解决思路,Android系统已经给我们提供了防止键盘遮挡输入内容的解决方案,比如在清单文件对应的Activity添加:
android:windowSoftInputMode="adjustPan|stateHidden"
这种方式很简单,在一些需要编辑的页面,可以将EditText顶起,解决了键盘可能遮挡的问题。
但是它还存在一个问题,就是他只能“顶起”输入部分,比如一个聊天页面,输入框在下方,我们希望的是,当键盘弹出的时候,将底部整个输入部分的View全部顶起,而不单单是不遮挡输入内容这么简单。
下面来简单说一下解决方案,“顶起”之所以加引号,是因为键盘并不是真正的将控件顶起来了,键盘是在视图的最上层,我们可以自定义一个需要适配键盘弹出和隐藏的View,来改变View的高度,达到所谓的弹出软键盘“顶起”View的效果。如图:
以下示例为Kotlin
,只做了最简单的适配示例,如果需要实现个性化需求,可自行修改。
自定义一个控件InputPanelView
,监听键盘弹出高度。
package ……
import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.RelativeLayout
import 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弹出软键盘“顶起”View的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何更改android edittext的样式,在弹出软键盘页面上加入button
android 自定义的dialog,edit text 不能获得焦点,弹出软键盘。