关于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

H5页面关于android软键盘弹出顶起底部元素的解决方案

android 自定义的dialog,edit text 不能获得焦点,弹出软键盘。

Android 上的 Flex:弹出软键盘时应用程序屏幕变黑

android自动弹出软键盘(输入键盘)

Android BottomSheetFragment Compose 弹出键盘顶起布局