android 沉浸状态栏下fitSystemWindow与键盘挡住输入框问题
在将状态栏改为沉浸时遇到了如下一个问题:fitsSystemWindows设置为true后,界面就无法全屏,因为顶部有一个状态栏高度的padding;不设置fitsSystemWindows,adjustResize模式无法用于沉浸全屏界面,导至输入框无法跟随键盘。
沉浸状态栏使用的工具:ImmersionBar
问题分析
-
fitSystemWindow
如果多个View设置了
fitsSystemWindows=”true”
,只有最外层view起作用,从最外层设置了fitsSystemWindows
的view开始计算padding,如果在布局中不是最外层控件设置fitsSystemWindows=”true”
, 那么设置的那个控件高度会多出一个状态栏高度。若有多个view设置了,因第一个view已经消耗掉insect,其他view设置了也会被系统忽略。 -
键盘挡住输入框问题
方法一、在AndroidManifest.xml对应的Activity里添加
windowSoftInputMode
属性adjustResize:调整activity主窗口的尺寸来为屏幕上的软键盘腾出空间
adjustPan:自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。只有关闭软键盘 才能看到因平移被遮盖的内容。
方法二、在布局最外层使用ScrollView
解决方案
去除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;