MAUI Blazor Android 输入框软键盘遮挡问题
前言
最近才发现MAUI Blazor Android存在输入框软键盘遮挡这个问题,搜索了一番,原来这是安卓webview一个由来已久的问题,还好有大佬提出了解决方案 AndroidBug5497Workaround,但是这是Java代码,MAUI中需要做一些小的修改,修改一些方法名还有类的明确引用。废话不多说,直接上代码。
解决方案
第一步
将下面的代码添加到Platforms/Android文件夹中,注意using ,一个也不能少,我最开始就是因为缺少using Rect = Android.Graphics.Rect;没有成功。命名空间也别忘了更改。
using Android.App;
using Android.Content;
using Android.Content.Res;
using Android.Widget;
using static Android.Resource;
using Rect = Android.Graphics.Rect;
using View = Android.Views.View;
namespace MauiBlazor3.Platforms.Android
{
    #nullable disable
    public class GlobalLayoutUtil
    {
        private bool isImmersed = false;
        private View mChildOfContent;
        private FrameLayout.LayoutParams frameLayoutParams;
        private int usableHeightPrevious = 0;
        public static void AssistActivity(Activity activity)
        {
            _ = new GlobalLayoutUtil(activity);
        }
        public GlobalLayoutUtil(Activity activity)
        {
            FrameLayout content = (FrameLayout)activity.FindViewById(Id.Content);
            mChildOfContent = content.GetChildAt(0);
            mChildOfContent.ViewTreeObserver.GlobalLayout += (s, o) => PossiblyResizeChildOfContent(activity);
            frameLayoutParams = (FrameLayout.LayoutParams)mChildOfContent.LayoutParameters;
        }
        private void PossiblyResizeChildOfContent(Activity activity)
        {
            //当前可视区域的高度
            int usableHeightNow = ComputeUsableHeight();
            //当前高度值和之前的进行对比,变化将进行重新绘制
            if (usableHeightNow != usableHeightPrevious)
            {
                //获取当前屏幕高度
                //Ps: 并不是真正的屏幕高度,是当前app的窗口高度,分屏时的高度为分屏窗口高度
                int usableHeightSansKeyboard = mChildOfContent.RootView.Height;
                // 高度差值:屏幕高度 - 可视内容高度
                int heightDifference = usableHeightSansKeyboard - usableHeightNow;
                // 差值为负,说明获取屏幕高度时出错,宽高状态值反了,重新计算
                if (heightDifference < 0)
                {
                    usableHeightSansKeyboard = mChildOfContent.RootView.Width;
                    heightDifference = usableHeightSansKeyboard - usableHeightNow;
                }
                // keyboard probably just became visible
                // 如果差值大于屏幕高度的 1/4,则认为输入软键盘为弹出状态
                if (heightDifference > usableHeightSansKeyboard / 4)
                {
                    // 设置布局高度为:屏幕高度 - 高度差
                    frameLayoutParams.Height = usableHeightSansKeyboard - heightDifference;
                }
                //else if (heightDifference >= GetNavigationBarHeight(activity))
                //{
                //    // keyboard probably just became hidden
                //    // 虚拟导航栏显示
                //    frameLayoutParams.Height = usableHeightNow - GetNavigationBarHeight(activity);
                //}
                else
                {// 其他情况直接设置为可视高度即可
                    frameLayoutParams.Height = usableHeightNow;
                }
            }
            // 刷新布局,会重新测量、绘制
            mChildOfContent.RequestLayout();
            // 保存高度信息
            usableHeightPrevious = usableHeightNow;
        }
        /**
         * 获取可视内容区域的高度
         */
        private int ComputeUsableHeight()
        {
            Rect rect = new Rect();
            mChildOfContent.GetWindowVisibleDisplayFrame(rect);
            if (isImmersed)
                return (int)rect.Bottom;
            else
                return (int)(rect.Bottom - rect.Top);
        }
        /**
         * 获取导航栏的真实高度
         *
         * @param context:
         * @return: 导航栏高度
         */
        private static int GetNavigationBarHeight(Context context)
        {
            int result = 0;
            Resources resources = context.Resources;
            int resourceId =
                    resources.GetIdentifier("navigation_bar_height", "dimen", "android");
            if (resourceId > 0)
                result = resources.GetDimensionPixelSize(resourceId);
            return result;
        }
    }
}
第二步
Platforms/Android/MainActivity.cs中添加以下代码
protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        GlobalLayoutUtil.AssistActivity(this);
    }
MAUI Blazor Android 输入框软键盘遮挡问题的更多相关文章
- Android软键盘遮挡的四种解决方案
		问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入 ... 
- Android软键盘遮挡布局的那些事
		有朋友提到软键盘遮挡布局的问题,说网上找了很多资料都未能解决,下面我来总结一下那些事,有些内容也是从网友那里学来的,但是我都会自己验证正确了才会贴出来. 首先来分析下我们常见的遮挡问题有哪些(本次所说 ... 
- Android软键盘遮挡布局问题;
		布局被软键盘遮挡虽然不是什么大问题,但还是比较影响用户体验的:最让人恼火的是当前输入框被软键盘被遮挡,来看一下解决方法: 1.当前输入框被软键盘遮挡,仅把输入框显示出来,不改变整体布局: 设置Mani ... 
- 移动端页面input输入框被键盘遮挡问题
		<body class="layout-fixed"> <!-- fixed定位的头部 --> <header> </header> ... 
- Android隐藏软键盘收回软键盘
		代码改变世界 Android隐藏软键盘收回软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPU ... 
- ios上有时候提交按钮点击两次才可以取消输入框软键盘
		ios上有时候提交按钮点击两次才可以取消输入框软键盘,点击第一次软键盘消失,点击第二次输入框页面消失,这样用户体验不好.我的做法是用 touchstart 代替click来处理 反应快,但是有时候会出 ... 
- Android WebView 软键盘挡住输入框
		解决方法一: 在所在的Activity中加入 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RES ... 
- android开发 软键盘出现后 防止EditText控件遮挡 总体平移UI
		在EditText控件接近底部的情况下 软键盘弹出后会把获得焦点的EditText控件遮挡 无法看到输入信息 防止这种情况发生 就须要设置AndroidManifest.xml的属性 前面的xml信 ... 
- 安卓H5软键盘遮挡输入框
		由于安卓app内嵌入H5页面,webview对于软键盘没有处理(如果不是产品强烈要求建议不要处理这种拆东墙补西墙的问题,因为其他的手机上可能会出现已经优化软键盘的情况) 1.input下方还有多余空位 ... 
- ios移动输入框被软键盘遮挡
		页面输入框会出现被软键盘挡住的问题: 解决方法:获取input点击事件设置body高度 $('input').bind('click',function(e){ var $this = $(this) ... 
随机推荐
- 1748E Yet Another Array Counting Problem
			1748E Yet Another Array Counting Problem 目录 1748E Yet Another Array Counting Problem 题目大意: 做法 code 题 ... 
- App复杂动画实现——Rive保姆级教程
			作者:京东物流 沈明亮 在App开发过程中,如果想实现动画效果,可以粗略分为两种方式.一种是直接用代码编写,像平移.旋转等简单的动画效果,都可以这么干,如果稍微复杂点,就会对开发工程师的数学功底.图形 ... 
- C# 几种获取电脑内存、CPU信息的方案
			计数器.WMI 获取设备的内存信息,如系统可用运行内存: 1 public static async Task<double> GetMemoryAvailableAsync(FileSi ... 
- [双目视差] 立体匹配算法推理 - SGBM算法(二)
			文章目录 立体匹配算法推理 - SGBM算法(二) 一.SGM算法 二. 后处理 立体匹配算法推理 - SGBM算法(二) 一.SGM算法 SGM算法的全称为Semi-Global Matching, ... 
- GPT护理机器人 - 让护士的工作变简单
			引子 书接上文<GPT接入企微应用 - 让工作快乐起来>,我把GPT接入了企微应用,不少同事都开始尝试起来了.有的浅尝辄止,有的刨根问底,五花八门,无所不有.这里摘抄几份: "帮 ... 
- 2023-04-09:使用 Golang 重写的 ffmpeg 示例encode_video.c,实现视频编码并将编码后的数据封装为容器格式,最终写入输出文件。
			2023-04-09:使用 Golang 重写的 ffmpeg 示例encode_video.c,实现视频编码并将编码后的数据封装为容器格式,最终写入输出文件. 答案2023-04-09: 本文介绍的 ... 
- 2021-05-17:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,可以任意切分成若干个不相交的子数组。其中一定存在一种最优方案,使得切出异或和为0的子数组最多。返回这个最多数量。
			2021-05-17:数组中所有数都异或起来的结果,叫做异或和.给定一个数组arr,可以任意切分成若干个不相交的子数组.其中一定存在一种最优方案,使得切出异或和为0的子数组最多.返回这个最多数量. 福 ... 
- vue全家桶进阶之路25:Vue2的停维通知
			Vue 2 的技术支持会持续多久?从官方发文来看,Vue 2.7 是当前.同时也是最后一个 Vue 2.x 的次级版本更新.Vue 2.7 会以其发布日期,即 2022 年 7 月 1 日开始计算,提 ... 
- uni-app 环境搭建
			环境搭建:下载Hbuilder X开发者工具 下载Hbuilderhttps://www.dcloud.io/index.htmlhttps://www.dcloud.io/hbuilderx.htm ... 
- django 与 vue 的完美结合
			django 与 vue 的完美结合 最近接到一个任务,就是用 django 后端,前段用 vue,做一个普通的简单系统,我就是一搞后端的,听到 vue 也是比较震惊,之前压根没接触过 vue.看 ... 
