Android聊天列表输入法挡住布局或顶起布局解决办法

最近在业余时间学习 MQTT 协议,想在 Android 上尝试用 MQTT 协议来做即时通讯,以便加深下了解。
在编写一个简单的聊天页面的时候,遇到了之前遇到过一个关于输入法与布局调整的问题,翻了好久才找到以前的笔记,现在记录下来,希望能帮到需要的朋友。

咸鱼.jfif

输入法与布局调整过程

我这个界面真的很简单,根布局是 LinearLayout,子视图有一个标题栏TextView,一个 RecyclerView ,底部是个输入框 LinearLayout,并且这是个 Fragment,布局伪代码如下




    
        
    
    
    

        

        

        

            

            
初始状态.png
输入法展开状态.png

问题解决过程如下

  1. 在 Activity 的清单声明中没有进行声明时,输入法弹出时会挡住布局文件。
  2. 当声明了 android:windowSoftInputMode="stateVisible|adjustResize" 整个布局会往上顶,也就是标题栏会冲出屏幕外了。
  3. 在 Fragment 根布局中设置 android:fitsSystemWindows="true",这个时候布局不会往上顶了,但是却多出了多余的空白间距,这是因为系统接管了根布局的top与bottom padding 值,topPadding 是状态栏的值,bottomPadding 是导航栏的高度(没有虚拟导航栏的话该值等于0)

    Sets whether or not this view should account for system screen decorations such as the status bar and inset its content; that is, controlling whether the default implementation of fitSystemWindows(Rect) will be executed. See that method for more details.
    Note that if you are providing your own implementation of fitSystemWindows(Rect), then there is no need to set this flag to true -- your implementation will be overriding the default implementation that checks this flag.

  4. 现在我们的App基本都是侵入到状态栏的,如果出现这种情况下,想要处理掉顶部或者底部的空白间距,就要需要重写根布局容器的 fitSystemWindows(insets: Rect) 函数。
    class NoFitPaddingLinearLayout @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
    ) : LinearLayout(context, attrs, defStyleAttr) {
    
        /**
        * 首次打开时获取底部的padding,用于之后的计算
        */
        private var initializerPaddingBottom = -1
    
        override fun fitSystemWindows(insets: Rect): Boolean {
            Log.w("NoFitPadding", insets.toString())
            if (initializerPaddingBottom == -1 && insets.bottom >= 0) {
                //初始化 initializerPaddingBottom 底部padding值
                initializerPaddingBottom = insets.bottom
            }
            insets.top = 0
            insets.bottom = insets.bottom - initializerPaddingBottom
            return super.fitSystemWindows(insets)
        }
    
    }
    

小结

我这个界面是一个超级简单的情况,大家遇到的情况可能跟这个不尽相同,但是解决思路是类似的。 总体朝着是否侵入状态栏,是否设置fitsSystemWindows的配置去摸索。
如有错漏还烦请指出哦。

搬砖.jfif

你可能感兴趣的:(Android聊天列表输入法挡住布局或顶起布局解决办法)