Manejo del problema de que el cuadro de entrada está bloqueado en el modo de pantalla completa de Android
Hace unos días, cuando hicimos un requisito de entrada de formulario de página, debido a que nuestro proyecto agregó una barra de estado inmersiva de pantalla completa, encontramos el problema del teclado bloqueando el cuadro de entrada. Después de un tratamiento simple, descubrimos que incluso si el teclado no bloquea el cuadro de entrada, volverá a llenar la página y se ve muy desagradable.
Los detalles son los siguientes:
Caso 1: el teclado bloquea el cuadro de entrada
Situación 2: se encabeza toda la página
Agregue el código de la siguiente manera:
<activity
android:name=".activity.AddGoldActivity"
android:windowSoftInputMode="adjustPan|stateHidden" />
Aqui esta la solucion
Echemos un vistazo al efecto después de la implementación:
Solución: vuelva a dibujar la página cuando se detecte que aparece el teclado
-
Importar: la clase de herramienta InputHandleUtil, los amigos que importaron el marco ZyFrame antes, pueden llamar directamente
Dirección del marco: https://github.com/Sunnyfor/ZyFrame haga clic para ver
Dependencia en línea: deployment'com.github.Sunnyfor: ZyFrame: 1.4.3 '
-
调用 : InputHandleUtil (). HandleInputView (rootView, scrollView, ignoreView)
Descripción de parámetros:
(1) rootView: debe pasar parámetros, la vista de diseño raíz del sistema (android.R.id.content)
(2) scrollView: opcional, ScrollView que contiene EditText
(3) ignoreView: opcional, vista que desea ignorar, esto La vista no se muestra cuando aparece el teclado, por ejemplo: el botón Enviar en la parte inferior
Nota: los dos últimos parámetros se utilizan en conjunto
Efecto uno:
InputHandleUtil().handleInputView(rootView)
Efecto 2:
InputHandleUtil().handleInputView(rootView, scrollView, ignoreView)
Efecto 3: Lo mismo se aplica al caso en el que la parte inferior es un cuadro de entrada.
El código de la herramienta es el siguiente:
/**
* Desc 用于处理全屏模式下输入框被遮挡问题
* Author ZY
* Date 2021/3/16
*/
class InputHandleUtil {
private var mRootView: ViewGroup? = null
private var rootViewParams: FrameLayout.LayoutParams? = null
private var rootViewMargin = 0
private var lastRootLayoutHeight = 0
private var scrollViewParams: ViewGroup.MarginLayoutParams? = null
private var scrollViewMargin = 0
private var ignoreViewParams: ViewGroup.MarginLayoutParams? = null
/**
* 处理包含输入框的容器方法
* @param rootView 基本View
* @param scrollView 只处理ScrollView内部view
* @param ignoreView 忽略scrollView外部的View
*/
fun handleInputView(
rootView: ViewGroup,
scrollView: ScrollView? = null,
ignoreView: View? = null
) {
mRootView = rootView.getChildAt(0) as ViewGroup
rootViewParams = mRootView?.layoutParams as FrameLayout.LayoutParams
rootViewMargin = rootViewParams?.bottomMargin ?: 0
mRootView?.viewTreeObserver?.addOnGlobalLayoutListener {
resizeLayout(scrollView, ignoreView)
}
lastRootLayoutHeight = getRootLayoutHeight()
scrollView?.let {
scrollViewParams = it.layoutParams as ViewGroup.MarginLayoutParams
scrollViewMargin = scrollViewParams?.bottomMargin ?: 0
}
ignoreView?.let {
ignoreViewParams = it.layoutParams as ViewGroup.MarginLayoutParams
}
}
private fun resizeLayout(scrollView: ScrollView?, ignoreView: View? = null) {
val currentRootLayoutHeight = getRootLayoutHeight()
if (currentRootLayoutHeight != lastRootLayoutHeight) {
val rootLayoutHeight = mRootView?.rootView?.height ?: 0
val keyBoardHeight = rootLayoutHeight - currentRootLayoutHeight
if (keyBoardHeight > rootLayoutHeight / 4) {
if (scrollView != null) {
val height = ignoreView?.height ?: 0
val topMargin = ignoreViewParams?.topMargin ?: 0
val bottomMargin = ignoreViewParams?.bottomMargin ?: 0
scrollViewParams?.bottomMargin =
keyBoardHeight - height - topMargin - bottomMargin
scrollView.requestLayout()
} else {
rootViewParams?.bottomMargin = rootViewMargin + keyBoardHeight
mRootView?.requestLayout()
}
} else {
if (scrollView != null) {
scrollViewParams?.bottomMargin = scrollViewMargin
//重绘scrollView布局
scrollView.requestLayout()
} else {
rootViewParams?.bottomMargin = rootViewMargin
//重绘xml根布局
mRootView?.requestLayout()
}
}
lastRootLayoutHeight = currentRootLayoutHeight
}
}
private fun getRootLayoutHeight(): Int {
val r = Rect()
mRootView?.getWindowVisibleDisplayFrame(r)
return r.bottom
}
}