前言

最近才发现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 输入框软键盘遮挡问题的更多相关文章

  1. Android软键盘遮挡的四种解决方案

    问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入 ...

  2. Android软键盘遮挡布局的那些事

    有朋友提到软键盘遮挡布局的问题,说网上找了很多资料都未能解决,下面我来总结一下那些事,有些内容也是从网友那里学来的,但是我都会自己验证正确了才会贴出来. 首先来分析下我们常见的遮挡问题有哪些(本次所说 ...

  3. Android软键盘遮挡布局问题;

    布局被软键盘遮挡虽然不是什么大问题,但还是比较影响用户体验的:最让人恼火的是当前输入框被软键盘被遮挡,来看一下解决方法: 1.当前输入框被软键盘遮挡,仅把输入框显示出来,不改变整体布局: 设置Mani ...

  4. 移动端页面input输入框被键盘遮挡问题

    <body class="layout-fixed"> <!-- fixed定位的头部 --> <header> </header> ...

  5. Android隐藏软键盘收回软键盘

    代码改变世界 Android隐藏软键盘收回软键盘 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPU ...

  6. ios上有时候提交按钮点击两次才可以取消输入框软键盘

    ios上有时候提交按钮点击两次才可以取消输入框软键盘,点击第一次软键盘消失,点击第二次输入框页面消失,这样用户体验不好.我的做法是用 touchstart 代替click来处理 反应快,但是有时候会出 ...

  7. Android WebView 软键盘挡住输入框

    解决方法一: 在所在的Activity中加入 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RES ...

  8. android开发 软键盘出现后 防止EditText控件遮挡 总体平移UI

    在EditText控件接近底部的情况下 软键盘弹出后会把获得焦点的EditText控件遮挡 无法看到输入信息  防止这种情况发生 就须要设置AndroidManifest.xml的属性 前面的xml信 ...

  9. 安卓H5软键盘遮挡输入框

    由于安卓app内嵌入H5页面,webview对于软键盘没有处理(如果不是产品强烈要求建议不要处理这种拆东墙补西墙的问题,因为其他的手机上可能会出现已经优化软键盘的情况) 1.input下方还有多余空位 ...

  10. ios移动输入框被软键盘遮挡

    页面输入框会出现被软键盘挡住的问题: 解决方法:获取input点击事件设置body高度 $('input').bind('click',function(e){ var $this = $(this) ...

随机推荐

  1. Kubernetes中使用Helm2的安全风险

    参考 http://rui0.cn/archives/1573 英文文章  https://blog.ropnop.com/attacking-default-installs-of-helm-on- ...

  2. STM32下载ELF文件、最小可执行bin文件测试

    1.STM32能下载ELF格式的文件吗? 答:可以.因为所谓的bin文件就是ELF文件的.text代码段. 当然前提是下载工具能识别ELF文件格式,STM32下载ELF文件并不意味着STM32可以把E ...

  3. 2023GDKOI游记

    2023GDKOI游记 DAY-5: 3.5 周五回家提前一天返校,连续打了两场比赛,第二场清华ACM就只打出了最后一题世界杯(签到题),然后就只会做第二题了,调了一下午没想到正解. DAY-4: 3 ...

  4. 对dubbo的DubboReference.check的参数进行剖析

    背景 在使用dubbo的时候,发现当消费者启动的时候,如果提供者没有启动,即使提供者后来启动了,消费者也调不通提供者提供的接口了. 注册中心使用都是nacos dubbo版本是3.0.4 例子 接口 ...

  5. [ Docker ] 部署 nps 和 npc 实现内网穿透

    https://www.cnblogs.com/yeungchie/ 云主机上运行 nps 创建映射目录 mkdir -p ~/docker/nps/config 拉取镜像 docker pull o ...

  6. flume组件以及通过命令监控大数据平台转态

    实验一.Flume 组件安装配置 1.下载和解压 Flume 可 以 从 官 网 下 载 Flume 组 件 安 装 包 , 下 载 地 址 如 下 URL 链 接 所 示 https://archi ...

  7. [Pytorch框架] 1.4 Autograd:自动求导

    文章目录 Autograd: 自动求导机制 张量(Tensor) 梯度 Autograd: 自动求导机制 PyTorch 中所有神经网络的核心是 autograd 包. 我们先简单介绍一下这个包,然后 ...

  8. 金三银四好像消失了,IT行业何时复苏!

    疫情时候不敢离职,以为熬过来疫情了,行情会好一些,可是疫情结束了,反而行情更差了, 这是要哪样 我心中不由一万个 草泥 路过 我心中不惊有了很多疑惑和感叹 接着上一篇 一个28岁程序员入行自述和感受 ...

  9. json和字典dict的区别

    json和字典dict的区别? 银河有希子关注 2021.07.03 11:13:00字数 987阅读 173 作者:Gakki json和字典dict的区别? 字典写法:dict1 = {'Alic ...

  10. IntelliJ IDEA一站式配置【全】(提高开发效率)

    IDEA常用设置(提高开发效率) 本人也是IDEA编译器的忠实用户了,但是有时出于各种原因,比如更换设备等等,IDEA总是需要重新安装配置.这就让我比较苦恼,因为总是记不全自己之前都修改了哪些地方(原 ...