ToB企服应用市场:ToB评测及商务社交产业平台

标题: MAUI Blazor Android 输入框软键盘遮挡问题 [打印本页]

作者: 种地    时间: 2023-3-7 11:30
标题: MAUI Blazor Android 输入框软键盘遮挡问题
前言

最近才发现MAUI Blazor Android存在输入框软键盘遮挡这个问题,搜索了一番,原来这是安卓webview一个由来已久的问题,还好有大佬提出了解决方案 AndroidBug5497Workaround,但是这是Java代码,MAUI中需要做一些小的修改,修改一些方法名还有类的明确引用。废话不多说,直接上代码。
解决方案

第一步

将下面的代码添加到Platforms/Android文件夹中,注意using ,一个也不能少,我最开始就是因为缺少using Rect = Android.Graphics.Rect;没有成功。命名空间也别忘了更改。
  1. using Android.App;
  2. using Android.Widget;
  3. using static Android.Resource;
  4. using Rect = Android.Graphics.Rect;
  5. using View = Android.Views.View;
  6. namespace MauiApp3.Platforms.Android
  7. {
  8.     public class AndroidBug5497Workaround
  9.     {
  10.         // For more information, see https://code.google.com/p/android/issues/detail?id=5497
  11.         // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.
  12.         public static void AssistActivity(Activity activity)
  13.         {
  14.             new AndroidBug5497Workaround(activity);
  15.         }
  16.         private View mChildOfContent;
  17.         private int usableHeightPrevious;
  18.         private FrameLayout.LayoutParams frameLayoutParams;
  19.         private AndroidBug5497Workaround(Activity activity)
  20.         {
  21.             FrameLayout content = (FrameLayout)activity.FindViewById(Id.Content);
  22.             mChildOfContent = content.GetChildAt(0);
  23.             mChildOfContent.ViewTreeObserver.GlobalLayout += (s, o) => PossiblyResizeChildOfContent();
  24.             frameLayoutParams = (FrameLayout.LayoutParams)mChildOfContent.LayoutParameters;
  25.         }
  26.         private void PossiblyResizeChildOfContent()
  27.         {
  28.             int usableHeightNow = ComputeUsableHeight();
  29.             if (usableHeightNow != usableHeightPrevious)
  30.             {
  31.                 int usableHeightSansKeyboard = mChildOfContent.RootView.Height;
  32.                 int heightDifference = usableHeightSansKeyboard - usableHeightNow;
  33.                 if (heightDifference > (usableHeightSansKeyboard / 4))
  34.                 {
  35.                     // keyboard probably just became visible
  36.                     frameLayoutParams.Height = usableHeightSansKeyboard - heightDifference;
  37.                 }
  38.                 else
  39.                 {
  40.                     // keyboard probably just became hidden
  41.                     frameLayoutParams.Height = usableHeightSansKeyboard;
  42.                 }
  43.                 mChildOfContent.RequestLayout();
  44.                 usableHeightPrevious = usableHeightNow;
  45.             }
  46.         }
  47.         private int ComputeUsableHeight()
  48.         {
  49.             Rect r = new Rect();
  50.             mChildOfContent.GetWindowVisibleDisplayFrame(r);
  51.             return (int)(r.Bottom - r.Top);// 全屏模式下: return r.bottom
  52.         }
  53.     }
  54. }
复制代码
第二步

Platforms/Android/MainActivity.cs中添加以下代码
  1. protected override void OnCreate(Bundle savedInstanceState)
  2.     {
  3.         base.OnCreate(savedInstanceState);
  4.         AndroidBug5497Workaround.AssistActivity(this);
  5.     }
复制代码
后记

网上还有一些其他人针对底部导航栏和华为的修复,貌似加的也不多,参考着改改就能用了

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4