Android WebView输入框被档问题升级解析

目录
  • 前言
  • issue 5497问题
  • 布局顶起后距离软键盘有一定距离
  • Activity的webview输入框被挡
  • 总结

前言

之前写过一篇文章,有讲如何处理Android输入框被软键盘挡住的问题,无论是原生的还是webview的,这里面主要的问题是webview的问题比较难处理,没有看过的可以先看看  Android 输入框被挡问题完美解决方案

主要是issue 5497这个问题。然后可能有些朋友觉得,这篇文章没能解决他的问题,或者说按照我的代码去写又会出现新的问题。这说明没有能理解这篇文章写的内容,我只是举了一个自己碰到的场景,然后去分析,为什么会这样,并用一些源码告诉你为什么这样写的能解决。但是并不是所有的场景去套这个代码都是正常的,不过如果你理解其中的一些原理的话,你至少能有个方向知道该从何下手去解决你自己碰到的场景。

如果看不懂没关系,我这次讲慢点,再去慢慢分析更多的场景,但是有一点要记住,我对这个问题的处理不是万金油,你必须要有一定的理解,知道一个方向,再去解决自己碰到的场景,不要直接套代码。 这里分析的问题就是issue 5497这个问题。

issue 5497问题

我们再简单回顾一下这个问题,原生的软键盘和输入框的冲突,直接设置window的softInputMode就能解决,这个很简单。但是如果输入框是webview内部H5的输入框的情况下pan会失效,只能用resize。并且,如果是这个window是概念上全屏的情况下(设置全屏的方式很多),resize也会失效。

我上一篇文章中,我碰到的问题的场景是: 一个Dialog,里面的根页面设置了沉浸模式,根布局下有一个webview,webview中有个输入框,点击输入框时弹出软键盘会挡住输入框。

我们先分析,为什么会挡住输入框?因为默认的softInputMode在正常情况下会顶起输入框,但是webview会失效,那我们就把softInputMode设成SOFT_INPUT_ADJUST_RESIZE

然后发现没效果,为什么没效果?因为我的Dialog是全屏的,并且设置了沉浸模式,所以符合了全屏情况下resize也会失效这个条件。注意这个全屏可以理解成指的是概念上的全屏,不是我们视觉效果上的全屏,也就是这时去设置marginTop,通过这些方法去改变视觉上不是全屏是不会有效果的。

我们的思路就是破解让这个window变成非全屏。 从上一篇文章可以看出,我们用的方法是设置fitSystemWindows,通过fitSystemWindows设置为true,来破解沉浸模式导致的全屏效果,原理是什么?通过上一篇文章知道,原理是设置一个安全距离,但是这个安全距离会导致你的window被压缩,所以我们要重写view的fitSystemWindows方法设置安全距离去防止window被压缩

@Override
protected boolean fitSystemWindows(Rect insets) {
    insets.top = 0;
    return super.fitSystemWindows(insets);
}

而这个问题的解决思路是通过设置fitSystemWindows去打破全屏这个条件,从而使SOFT_INPUT_ADJUST_RESIZE能对webview生效。 这是重点的一步,后续的操作都是为了处理fitSystemWindows所带来的影响。

布局顶起后距离软键盘有一定距离

一般我们的布局顶起后底部也是紧贴软键盘,有的朋友可能会说,为什么我也这样做了,但是我webview布局被软键盘顶起之后距离软键盘会存在一部分的间距。

如果你不知道这个问题,说明对softInputMode不太理解,虽然我个人对这个理解也不是很深,但是如果你能使用SOFT_INPUT_ADJUST_PAN的话,就一定不会出现这个问题,但是用SOFT_INPUT_ADJUST_RESIZE的话,就会在某些布局中有这个问题,可惜上面说了,webview对SOFT_INPUT_ADJUST_PAN无效。

这是为什么呢?因为简单来说SOFT_INPUT_ADJUST_PAN是顶起你的输入框,而SOFT_INPUT_ADJUST_RESIZE会把window给顶起来。所以如果你是window全屏并且webview也是全屏的情况就不会遇到这个问题(这里其实也就高度影响,宽度不影响),但如果你是window中的webview距离window的底部有一定的距离,这时候用SOFT_INPUT_ADJUST_RESIZE顶起来就会和输入法有一段距离。

那这个问题要如何解决,这个解决的方法很多,比如通过逻辑手段,或者调整webview大小之类的,这个就没什么好说的了。

Activity的webview输入框被挡

上一篇文章包括上面有讲我在Dialog中的webview的场景的解决方案。有的朋友会说我activity的webview也是这样的,但是按照你这个代码写进去没有效果,我明明也给window设置了SOFT_INPUT_ADJUST_RESIZE,也给view设置了setFitsSystemWindows,也重写了fitSystemWindows方法设置top,但是没效果。

这就说明你还没明白为什么会出现这个问题,你只是希望随便去找个文章拷代码下来用,代码有用就觉得这个作者牛,代码没效果就觉得这个作者傻。好,哪怕你是不看为什么,只想考代码,套到你使用的地方没效果,那为何不问问为什么没效果,你可以在评论区留言,说你是什么样的场景,使用这个代码没效果。写一两句留言对你来说也并不耗多少时间,我只是觉得,解决问题,需要知道一个方向,不能一味的只想抄答案,这样去解决问题是很耗费时间的,而且这样解决问题也可能会出现其它的问题。

有点扯远了,话说回来,为什么上面的代码对Activity可能没效果。如果认真看都知道,我说了造成SOFT_INPUT_ADJUST_RESIZE失效的原因是全屏,而我上面Dialog的场景,造成全屏的操作是设置了沉浸模式,所以setFitsSystemWindows是为了处理沉浸模式导致全屏的情况。而你的Activity的全屏,不一定是沉浸模式造成的,所以你使用setFitsSystemWindows会无效。

还看不懂没关系,再举个例子。你给你的activity设置Fullscreen的主题theme也会导致全屏,这时候给window设置SOFT_INPUT_ADJUST_RESIZE无效,我们的思路是如何去破解Fullscreen这个主题造成的全屏。我们可以动态去概念theme,行不行?当然可以,但是这个时机要写对。

我们也可以用window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)去破解全屏的效果嘛。但是这个clearFlags如果对你的需求造成了影响,你还要通过其它方法去消除这个影响,这种就具体分析具体解决了,没有标准的答案。

总结

写这篇文章主要是想说明,这个webview被输入法挡住的问题,这个issue 5497,是一个比较麻烦的问题,它不是光靠随便在网上去抄个代码就能解决的。包括你可能会去通过监听输入法的弹出去计算滚动的高度,这种方法理论上是不难,实际去开发也是要做一些细节处理和兼容的。

这篇文章没有贴多少代码,主要讲一个解决问题的思路。要去理解这个问题是为什么发生的,知道一个方向,才能去更好的解决问题,你可以不按照我的代码去写,但是你知道解决问题的方向后,你甚至能自己通过适合自己业务的逻辑代码去解决你的问题。

我不保证我对整个问题的理解是完全正确的,但是如果有大佬觉得我的理解有问题,可以指出,我也希望能这样,这样反而让我印象更深刻。但是如果有人想不了解这些内容的情况下通过去找别人的代码去碰运气来解决问题,那我也只能祝你好运。

以上就是Android WebView输入框被档问题升级解析的详细内容,更多关于Android WebView输入框的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android WebView基础应用详解

    目录 一.WebView的基础配置 二.WebView支持播放音乐 三.WebView支持视频播放 四.WebChromeClient 五.WebViewClient 1.重定向问题 2.实现预加载 3.增加错误页面展示限制 4.解决页面白屏问题 附GitHub源码:WebViewExplore 一.WebView的基础配置 WebSettings ws = getSettings(); ws.setBuiltInZoomControls(true);// 隐藏缩放按钮 ws.setLayout

  • 浅谈Android开发Webview的Loading使用效果

    目录 前言 1. loading的选择 2. loading显示时机的问题 3. 体验优化 4. loading最终设计效果 总结 前言 在开发webview的loading效果的时候会有一些问题,这边记录一些碰到的常见的问题,并且设计出一套Loading的方案来解决相关的问题. 1. loading的选择 开发loading效果的原因在于webview加载页面的时候,有时候会耗时,导致不显示内容又没有任何提示,效果不太好,所以需要在webview使用的地方加上loading的效果,其实更好的体

  • Android WebView控件基本使用示例

    Android WebView用于在 android 中显示网页.可以从相同的应用程序或 URL 加载网页.它用于在 android 活动中显示在线内容. Android WebView 使用 webkit 引擎来显示网页. android.webkit.WebView 是 AbsoluteLayout 类的子类. Android WebView 类的loadUrl()和loadData()方法用于加载和显示网页. Android WebView 示例 让我们看看使用 Web 视图显示 baid

  • Android WebView实现全屏播放视频

    目录 介绍 主要代码 介绍 最近项目开发中用到了WebView播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里总结了一下,希望大家看到后不要再犯类似的错误,尽可能提高开发效率: 这个Demo我这里也参考了网上写的一个比较好的一个Demo,经过总结修改,写出来的. 主要代码 以下是相应代码: MainActivity: package com.androidwebviewdemo; import android.app.Activity; import androi

  • Android WebView软键盘遮挡输入框方案详解

    目录 背景 纪实 方案 实现 总结 背景 笔者在使用 WebView 加载含有输入框的 H5 页面时,点击输入框后,输入框会被软键盘遮挡住,无法看到输入的内容,这很影响用户体验. 笔者想着这种业务场景比较常见,遂上网搜索一番,果不其然,有不少同志遇到这个问题,想来这个问题很好解决了.笔者一一尝试了同志们提供的解决方案,结果要不是没有作用,要不是效果不太满意,只好自己另辟蹊径了. 注:在笔者的业务场景中,App是全屏的,即没有顶部的系统栏,也没有底部的导航栏,所以笔者的解决方案,可能不适用于其他场

  • Android WebView缓存机制优化加载慢问题

    目录 一 .前言 二 .WebView存在的性能问题 2.1 H5 页面加载速度慢 2.1.1 渲染速度慢 2.1.2 页面资源加载缓慢 2.2 耗费流量 2.3 总结 三 .解决方案 3.1 前端H5的缓存机制 3.1.1 缓存机制 3.1.2 缓存模式 3.2 资源预加载 3.2.1 预加载WebView对象 3.2.2 预加载H5资源 3.3 自身构建缓存 3.3.1 需求场景 3.3.2 实现步骤 3.3.3 具体实现 3.3.4 具体实例 一 .前言 由于H5具备 开发周期短.灵活性好

  • Android webView加载数据时内存溢出问题及解决

    目录 Android webView加载数据时内存溢出 Android内存问题 (内存溢出 内存泄漏 内存抖动) 总结 Android webView加载数据时内存溢出 今天使用webView加载数据时   如果数据太长就会崩溃,造成内存溢出,在网上查找了一下资料之后   终于把它解决了,谨在此记录 1.不要在XML里面写webView 可以使用一个占位布局 <FrameLayout     android:id="@+id/layoutWebView"     android:

  • Android WebView预渲染介绍

    目录 前言 术语对齐 客户端可以从哪些方面优化h5页面的加载速度? 优化思路 预渲染的基本实现逻辑是怎样的? 预创建 预创建个数 预创建时机 预创建复用 预渲染 预渲染时机 预渲染有效性校验 时间有效性 状态有效性 页面显示状态通知 其它注意事项 预渲染存在哪些局限性? 总结 前言 在一个Hybrid项目中,必不可少的就是加载h5页面.h5页面的加载性能极大影响着用户体验,并会从各方面影响到我们APP的业务数据.试想,假设一个h5页面要花好几秒才能打开,那用户还会使用我们的APP吗?所以今天我们

  • Android WebView如何判断是否滚动到底部

    目录 场景: 分析: 实现: 总结 场景: 我们有时候需要弹一些必读公告,但是呢可能会要去你看完之后才可以关掉,所以就需要滚动到底部才显示关闭按钮,而公告什么的往往又是基于富文本的,那么在展示在Android上时就要用到WebView,基于这个要求就有了判断 WebView 判断是否滚动到底部. 分析: 要判断是否到底部那么我们先来分析有哪几种情况,当html文档加载到WebView后会有一下两种情况. WebView里的html内容没有填充满,就是无滚动条情况.html内容的高度比WebVie

  • Android WebView交互传递json字符串并解析的方法

    前言 我们大家都知道WebView交互中可以传递基本数据类型的数据值,比如常用的int,String. 但是WebView也可以传递一种很重要很常用的数据格式-json数据. 传递json和传递String数据是一样的,关键就是HTML5端对json数据通过eval()函数进行解析 传递过程中android端调用的最重要的一个函数就是: addJavascriptInterface(new MyObject(this,"dd"),"my"); 这个函数有两个参数,第

  • Android WebView 上传文件支持全解析

    默认情况下情况下,使用Android的WebView是不能够支持上传文件的.而这个,也是在我们的前端工程师告知之后才了解的.因为Android的每个版本WebView的实现有差异,因此需要对不同版本去适配.花了一点时间,参考别人的代码,这个问题已经解决,这里把我踩过的坑分享出来. 主要思路是重写WebChromeClient,然后在WebViewActivity中接收选择到的文件Uri,传给页面去上传就可以了. 创建一个WebViewActivity的内部类 public class XHSWe

  • Android WebView与JS交互全面详解(小结)

    Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5页面等,下面来看看这两是怎么交互的 目录 1.

  • Android webview如何加载HTML,CSS等语言的示例

    前言 这个题目可能取得不大好,想了很久没想出更合适的了.在android开发webview的时候,有的时候后台不一定给的就是一个url,而是把一些HTML,css,js语言代码给你,然后你自行组装出webview能够识别的语言,并加载到页面当中. 加载html无非有三种情况:一.存放在assets文件夹下的html文件:二.直接加载某个指定的网页. 三.从网络上解析得到的html代码,注意此处是代码,即字符串格式. 示例 /** * body : <div class="main-wrap

  • Android Studio 3.0 新功能全面解析和旧项目适配问题

    简介: Android Studio是Android的官方IDE.它是专为Android而打造,可以加快您的开发速度,帮助您为每款Android设备构建最优应用. 它提供专为Android开发者量身定制的工具,其中包括丰富的代码编辑.调试.测试和性能分析工具. 上周四,Google 终于在经历大半年的打磨锤炼之后正式发布 Android Studio 3.0 版本,给广大安卓开发人员一份满意的答卷.如往常一样,每次新版开发工具的发布,很多谨慎点的朋友仍担心稳定性.是否存在坑等问题,选择隔岸观火,

  • Android WebView使用的技巧与一些坑

    随着手机性能的提高,以及iOS和Android两个平台的普及,更多的App都会选择两个平台的App都进行开发,在有些时候,为了更加快速的开发,我们会采用hybird方式开发,这个时候我们需要使用webview并且自己进行一些配置.Android的webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了chrome,因此问题很多,这里分享一些我使用过程的一些技巧和遇到的坑. ###webview配置### mWebview.getSettings().setJavaScr

  • Android随手笔记44之JSON数据解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析. 1.JSON数据结构 在JSON中有两种数据结构:对象和数组. 1.1对象 在JSON中,一个对象以"{"(左括号)开始,"}"(右括号)结束.每个"名称"

  • Android MeasureSpec的理解和源码的解析

    Android  MeasureSpec的理解和源码的解析 MeasureSpec的创建规则: 实例详解: package cc.ww; import android.view.View; import android.view.View.MeasureSpec; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.MarginLayoutParams; import android.widget.L

  • Android WebView组件用法详解

    本文实例讲述了Android WebView组件用法.分享给大家供大家参考,具体如下: 如果想WebView能够访问网络,必须在AndroidManifest.xml里面添加权限 <uses-permission android:name="android.permission.INTERNET" /> main.xml很简单,就是一个WebView <?xml version="1.0" encoding="utf-8"?&g

随机推荐