Manejo del problema de que el cuadro de entrada está bloqueado en el modo de pantalla completa

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
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" />

Toda la página está coronada

Aqui esta la solucion

Echemos un vistazo al efecto después de la implementación:
Efecto después de la realización

Solución: vuelva a dibujar la página cuando se detecte que aparece el teclado

  1. 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 '

  2. 调用 : 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 uno

Efecto 2:
InputHandleUtil().handleInputView(rootView, scrollView, ignoreView)
Efecto dos
Efecto 3: Lo mismo se aplica al caso en el que la parte inferior es un cuadro de entrada.
Cuadro de entrada inferior

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
    }
}

Supongo que te gusta

Origin blog.csdn.net/Chenyongzuo/article/details/114983083
Recomendado
Clasificación