Browse Source

修改学生端H5页面输入框无法弹起问题

Pq 1 year ago
parent
commit
6fbc72a62f

+ 79 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/AndroidBug5497Workaround.java

@@ -0,0 +1,79 @@
+package com.cooleshow.base.utils;
+
+import android.app.Activity;
+import android.graphics.Rect;
+import android.os.Build;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+
+/**
+ * Author by pq, Date on 2023/1/10.
+ */
+public class AndroidBug5497Workaround {
+    public static void assistActivity(Activity activity) {
+        new AndroidBug5497Workaround(activity);
+    }
+
+    private View mChildOfContent;
+    private int usableHeightPrevious;
+    private FrameLayout.LayoutParams frameLayoutParams;
+    private int contentHeight;
+    private boolean isfirst = true;
+    private Activity activity;
+    private int statusBarHeight;
+
+    private AndroidBug5497Workaround(Activity activity) {
+        //获取状态栏的高度
+        int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
+        statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
+        this.activity = activity;
+        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
+        mChildOfContent = content.getChildAt(0);
+        //界面出现变动都会调用这个监听事件
+        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+            public void onGlobalLayout() {
+                if (isfirst) {
+                    contentHeight = mChildOfContent.getHeight();//兼容华为等机型
+                    isfirst = false;
+                }
+                possiblyResizeChildOfContent();
+            }
+        });
+        frameLayoutParams = (FrameLayout.LayoutParams)
+                mChildOfContent.getLayoutParams();
+    }
+
+    //重新调整跟布局的高度
+    private void possiblyResizeChildOfContent() {
+        int usableHeightNow = computeUsableHeight();
+        //当前可见高度和上一次可见高度不一致 布局变动
+        if (usableHeightNow != usableHeightPrevious) {
+            //int usableHeightSansKeyboard2 = mChildOfContent.getHeight();//兼容华为等机型
+            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
+            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
+            if (heightDifference > (usableHeightSansKeyboard / 4)) {
+                // keyboard probably just became visible
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+                    //frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
+                    frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;
+                } else {
+                    frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
+                }
+            } else {
+                frameLayoutParams.height = contentHeight;
+            }
+            mChildOfContent.requestLayout();
+            usableHeightPrevious = usableHeightNow;
+        }
+    }
+
+    /**
+     * 计算mChildOfContent可见高度 ** @return
+     */
+    private int computeUsableHeight() {
+        Rect r = new Rect();
+        mChildOfContent.getWindowVisibleDisplayFrame(r);
+        return (r.bottom - r.top);
+    }
+}

+ 2 - 1
student/src/main/AndroidManifest.xml

@@ -233,7 +233,8 @@
         <activity
             android:name=".ui.web.HtmlActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
-            android:screenOrientation="portrait" />
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="adjustPan"/>
         <activity
             android:name=".ui.web.HtmlHorizontalScreenActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"

+ 2 - 0
student/src/main/java/com/cooleshow/student/ui/web/HtmlActivity.java

@@ -51,6 +51,7 @@ import com.cooleshow.base.constanst.Constants;
 import com.cooleshow.base.data.net.RetrofitClientNoToken;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseActivity;
+import com.cooleshow.base.utils.AndroidBug5497Workaround;
 import com.cooleshow.base.utils.AppUtils;
 import com.cooleshow.base.utils.ClipboardUtils;
 import com.cooleshow.base.utils.LogUtils;
@@ -149,6 +150,7 @@ public class HtmlActivity extends BaseActivity<ActivityHtml1Binding> implements
         //限制截屏和录屏
 //        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
         super.onCreate(savedInstanceState);
+        AndroidBug5497Workaround.assistActivity(this);
         EventBus.getDefault().register(this);
         api = WXAPIFactory.createWXAPI(this, null);
         api.registerApp("wx149a928c415c137a");