android 沉浸状态栏下fitSystemWindow与键盘挡住输入框问题

android 沉浸状态栏下fitSystemWindow与键盘挡住输入框问题

在将状态栏改为沉浸时遇到了如下一个问题:fitsSystemWindows设置为true后,界面就无法全屏,因为顶部有一个状态栏高度的padding;不设置fitsSystemWindows,adjustResize模式无法用于沉浸全屏界面,导至输入框无法跟随键盘。

沉浸状态栏使用的工具:ImmersionBar

问题分析

  1. fitSystemWindow

    如果多个View设置了fitsSystemWindows=”true”,只有最外层view起作用,从最外层设置了fitsSystemWindows的view开始计算padding,如果在布局中不是最外层控件设置fitsSystemWindows=”true”, 那么设置的那个控件高度会多出一个状态栏高度。若有多个view设置了,因第一个view已经消耗掉insect,其他view设置了也会被系统忽略。

    详细内容见全屏、沉浸式、fitSystemWindow使用及原理分析:全方位控制“沉浸式”的实现

  2. 键盘挡住输入框问题

    方法一、在AndroidManifest.xml对应的Activity里添加windowSoftInputMode属性

    adjustResize:调整activity主窗口的尺寸来为屏幕上的软键盘腾出空间

    adjustPan:自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。只有关闭软键盘 才能看到因平移被遮盖的内容。

    方法二、在布局最外层使用ScrollView

    详细内容见android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法

解决方案

去除fitSystemWindow,然后使用adjustResize以保证输入框跟随软键盘,所以现在只要解决一个问题:adjustResize在全屏时失效

最后通过监听addOnGlobalLayoutListener在输入法弹出时改变rootView或DecorView的高度,使view高度=屏幕高度-输入法高度。代码如下:


import android.app.Activity;
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;


public class FullScreenInputWorkaround {
   

    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.
    private static final String TAG = "AndroidBug5497Workaround";

    public static FullScreenInputWorkaround assistActivity(Activity activity, View contentView, InputShowListener inputShowListener) {
   
        return new FullScreenInputWorkaround(activity, contentView, inputShowListener);
    }

    private Activity activity;
    private View mChildOfContent;
    private int usableHeightPrevious;
    private ViewGroup.LayoutParams layoutParams;
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值