所谓人在家中坐锅从天上来。
项目里有个客服系统是接入的h5,最近收到反馈用户在客服系统输入时,输入框被Android弹起的软件盘遮挡,从而看不到输入框内容的问题。
一开始想到的就是应该是没设置键盘自适应的属性,打开manifest找到相应的Activity,果然没有设置。不多说一顿操作猛如虎,设置
android:windowSoftInputMode="adjustResize"
android:windowSoftInputMode="adjustResize|adjustSpan"
android:windowSoftInputMode="adjustSpan"
(2)但是在h5全屏模式下以上两种方法都是失效的。这是Android系统目前存在的一个bug,编号5497。若需要在h5全屏模式下解决该问题,需要自己手动添加一个类,如下:
public class AndroidBug5497Workaround { // 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. public static void assistActivity(Activity activity) { new AndroidBug5497Workaround(activity); } private View mChildOfContent; private int usableHeightPrevious; private FrameLayout.LayoutParams frameLayoutParams; private AndroidBug5497Workaround(Activity activity) { //Decorview里分为title和content,content即是承载我们setContentView方法的布局的根布局 FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); //mChildOfContent我们setContentView方法的布局 mChildOfContent = content.getChildAt(0); //监听布局变化,任何界面变化都会触发该监听 //软键盘弹起同样也会触发该监听 mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { public void onGlobalLayout() { possiblyResizeChildOfContent(); } }); frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); } private void possiblyResizeChildOfContent() { int usableHeightNow = computeUsableHeight(); if (usableHeightNow != usableHeightPrevious) { int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); //计算布局变化的高度 int heightDifference = usableHeightSansKeyboard - usableHeightNow; if (heightDifference > (usableHeightSansKeyboard / 4)) { // keyboard probably just became visible //如果布局变化的高度大于全屏高度的4分之一,则认为可能是键盘弹出,需要改变我们setContentView的布局高度 frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; } else { // keyboard probably just became hidden frameLayoutParams.height = usableHeightSansKeyboard; } //布局改变后重绘 mChildOfContent.requestLayout(); usableHeightPrevious = usableHeightNow; } } //计算去掉键盘高度后的可用高度 private int computeUsableHeight() { Rect r = new Rect(); mChildOfContent.getWindowVisibleDisplayFrame(r); return (r.bottom - r.top);// 全屏模式下: return r.bottom // return r.bottom; } }
该类原理已添加在注释当中。
使用方式是引入该类后,在所需要设置的Activity oncreat()中添加如下一行代码
AndroidBug5497Workaround.assistActivity(this);
(1)Native页面:可设置adjustResize或adjustSpan属性。
(2)h5页面下:
参考资料:
https://code.google.com/p/android/issues/detail?id=5497
https://www.diycode.cc/topics/383
原文:https://www.cnblogs.com/li-sir/p/13846805.html