Android軟鍵盤彈起遮擋h5頁面解決方法
所謂人在家中坐鍋從天上來。
項目里有個客服系統是接入的h5,最近收到反饋用戶在客服系統輸入時,輸入框被Android彈起的軟件盤遮擋,從而看不到輸入框內容的問題。


一開始想到的就是應該是沒設置鍵盤自適應的屬性,打開manifest找到相應的Activity,果然沒有設置。不多說一頓操作猛如虎,設置
android:windowSoftInputMode="adjustResize"
打開調試,如果你的當前Activity不是全屏模式,那么恭喜你,成功了。但是不幸的是我這個項目里Activity是全屏模式。結果還是被軟鍵盤擋住。一臉懵逼~什么鬼。網上一搜,除了這個屬性,全是讓h5改屬性的。把鍋甩給h5?h5同學一臉懵逼,我這個客服模塊在集團其他項目也用,該設置的position,fixed等屬性都設置了,人家沒報問題,你們自己想想辦法。得,搞到最后鍋還是回來了。那只能自己想辦法了。。。
最終發現是設置Activity全屏模式引起的問題。要解決軟件盤彈起遮擋問題,一版如下兩種方式
(1)Native Activity非全屏模式下,要適應軟鍵盤彈起一般可設置如下兩種屬性中的一種。
最終發現是設置Activity全屏模式引起的問題。要解決軟件盤彈起遮擋問題,一版如下兩種方式
(1)Native Activity非全屏模式下,要適應軟鍵盤彈起一般可設置如下兩種屬性中的一種。
android:windowSoftInputMode="adjustResize|adjustSpan"
有人說h5在這種模式下會失效。親測adjustSpan確實是會在h5頁面失效。
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頁面下:
- h5非全屏模式,可設置adjustResize
- h5全屏模式,可設置AndroidBug5497Workaround
參考資料:
https://code.google.com/p/android/issues/detail?id=5497
https://www.diycode.cc/topics/383
鏈接:https://www.jianshu.com/p/b8f99a197ba5
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
第二個 ios問題
或者使用 window.scrollTo(0, 0) 這個方法沒試
